ServletUtils.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */

  20. package org.openspcoop2.web.lib.mvc;

  21. import java.lang.reflect.InvocationTargetException;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.UUID;
  28. import java.util.concurrent.ConcurrentHashMap;

  29. import javax.servlet.http.Cookie;
  30. import javax.servlet.http.HttpServletRequest;
  31. import javax.servlet.http.HttpServletResponse;
  32. import javax.servlet.http.HttpSession;

  33. import org.apache.commons.lang3.SerializationUtils;
  34. import org.apache.commons.lang3.StringUtils;
  35. import org.apache.struts.action.ActionForward;
  36. import org.apache.struts.action.ActionMapping;
  37. import org.openspcoop2.core.commons.ISearch;
  38. import org.openspcoop2.protocol.sdk.properties.IConsoleHelper;
  39. import org.openspcoop2.utils.BooleanNullable;
  40. import org.openspcoop2.utils.resources.ClassLoaderUtilities;
  41. import org.openspcoop2.web.lib.mvc.Dialog.BodyElement;
  42. import org.openspcoop2.web.lib.mvc.properties.beans.ConfigBean;
  43. import org.openspcoop2.web.lib.users.dao.User;
  44. import org.slf4j.Logger;
  45. import org.springframework.http.HttpStatus;

  46. /**
  47.  * ServletUtils
  48.  *
  49.  * @author Andrea Poli (apoli@link.it)
  50.  * @author $Author$
  51.  * @version $Rev$, $Date$
  52.  */
  53. public class ServletUtils {
  54.    
  55.     private ServletUtils() {}


  56.     /* ------ STRUTS -FORWARD -ERROR */

  57.     public static ActionForward getStrutsForwardError(Logger log,Throwable e,PageData pd,HttpServletRequest request, HttpSession session, GeneralData gd, ActionMapping mapping, String objectName,ForwardParams forwardType){
  58.         return getStrutsForwardError(log, e, pd, request, session, gd, mapping, objectName, forwardType, Costanti.MESSAGGIO_SISTEMA_NON_DISPONIBILE);
  59.     }
  60.    
  61.     public static ActionForward getStrutsForwardError(Logger log,Throwable e,PageData pd,HttpServletRequest request, HttpSession session, GeneralData gd, ActionMapping mapping, String objectName,ForwardParams forwardType,String message){
  62.         if(e!=null)
  63.             log.error("SistemaNonDisponibile: "+e.getMessage(), e);
  64.         else
  65.             log.error("SistemaNonDisponibile");
  66.         pd.disableEditMode();
  67.         pd.setMessage(message);
  68.         pd.setMostraLinkHome(true);
  69.         ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
  70.         return ServletUtils.getStrutsForwardGeneralError(mapping, objectName, forwardType);
  71.     }



  72.     /* ------ STRUTS - FORWARD ---- */

  73.     private static String getStrutsForwardName(String objectName,ForwardParams forwardParams){
  74.         String forward = objectName;
  75.         if(TipoOperazione.ADD.equals(forwardParams.getTipoOperazione())){
  76.             forward = forward + "Add";
  77.         }
  78.         else if(TipoOperazione.CHANGE.equals(forwardParams.getTipoOperazione())){
  79.             forward = forward + "Change";
  80.         }
  81.         else if(TipoOperazione.DEL.equals(forwardParams.getTipoOperazione())){
  82.             forward = forward + "Del";
  83.         }
  84.         else if(TipoOperazione.LIST.equals(forwardParams.getTipoOperazione())){
  85.             forward = forward + "List";
  86.         }
  87.         else if(TipoOperazione.OTHER.equals(forwardParams.getTipoOperazione())){
  88.             forward = forward + forwardParams.getOtherContext();
  89.         }
  90.         return forward;
  91.     }

  92.     public static ActionForward getStrutsForwardEditModeInProgress(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  93.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams)+Costanti.STRUTS_FORWARD_FORM);
  94.     }
  95.     public static ActionForward getStrutsForwardEditModeConfirm(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  96.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams)+Costanti.STRUTS_FORWARD_CONFIRM_FORM);
  97.     }
  98.     public static ActionForward getStrutsForwardEditModeFinished(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  99.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams)+Costanti.STRUTS_FORWARD_OK);
  100.     }
  101.     public static ActionForward getStrutsForwardEditModeCheckError(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  102.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams)+Costanti.STRUTS_FORWARD_CHECK_ERROR);
  103.     }
  104.     public static ActionForward getStrutsForwardGeneralError(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  105.         return mapping.findForward(objectName+Costanti.STRUTS_FORWARD_ERRORE_GENERALE);
  106.     }
  107.     public static ActionForward getStrutsForward(ActionMapping mapping,String objectName,ForwardParams forwardParams){
  108.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams));
  109.     }
  110.     public static ActionForward getStrutsForward(ActionMapping mapping,String objectName,ForwardParams forwardParams,String suffix){
  111.         return mapping.findForward(getStrutsForwardName(objectName, forwardParams)+suffix);
  112.     }




  113.     /* ------ CHECKBOX ---- */
  114.    
  115.     public static String boolToCheckBoxStatus(Boolean value) {
  116.         if (value == null) value = false;
  117.        
  118.         return value ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED;
  119.     }
  120.    
  121.     public static boolean isCheckBoxEnabled(String value){
  122.         return Costanti.CHECK_BOX_ENABLED.equals(value) ||
  123.                 Costanti.CHECK_BOX_ENABLED_TRUE.equalsIgnoreCase(value) ||
  124.                 Costanti.CHECK_BOX_ENABLED_ABILITATO.equalsIgnoreCase(value);
  125.     }
  126.     public static void setCheckBox(DataElement de,String checkBoxValue){
  127.         if(isCheckBoxEnabled(checkBoxValue)){
  128.             de.setSelected(Costanti.CHECK_BOX_ENABLED);
  129.         }
  130.         else{
  131.             de.setSelected(Costanti.CHECK_BOX_DISABLED);
  132.         }
  133.     }
  134.     public static void setCheckBox(DataElement de,boolean checkBoxValue){
  135.         if(checkBoxValue){
  136.             de.setSelected(Costanti.CHECK_BOX_ENABLED);
  137.         }
  138.         else{
  139.             de.setSelected(Costanti.CHECK_BOX_DISABLED);
  140.         }
  141.     }



  142.     /* ------ EDIT - SAVE MODE ---- */

  143.     public static DataElement getDataElementForEditModeInProgress(){
  144.         return Costanti.DATA_ELEMENT_HIDDENT_EDIT_MODE_IN_PROGRESS;
  145.     }

  146.     public static DataElement getDataElementForEditModeFinished(){
  147.         return Costanti.DATA_ELEMENT_HIDDENT_EDIT_MODE_END;
  148.     }

  149.     public static Parameter getParameterForEditModeFinished(){
  150.         return Costanti.PARAMETER_EDIT_MODE_END;
  151.     }

  152.     public static boolean isEditModeInProgress(String editMode){
  153.         return !Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END.equals(editMode);
  154.     }

  155.     public static boolean isEditModeFinished(String editMode){
  156.         return !Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_END.equals(editMode);
  157.     }

  158.     public static boolean isSearchDone(IConsoleHelper consoleHelper){
  159.         try {
  160.             String v = consoleHelper.getParameter(Costanti.PARAMETER_NAME_SEARCH_LIST_DONE);
  161.             return "true".equals(v); // listElement.jsp:   addHidden(form, '_searchDone' , true);
  162.         }catch(Exception e) {}
  163.         return false;
  164.     }


  165.     /* ------ PAGE DATA (TITLE) ---- */

  166.     public static Parameter getParameterAggiungi() {
  167.         return new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_AGGIUNGI, null);
  168.     }
  169.    
  170.     public static void setPageDataTitle_ServletFirst(PageData pd,String t1Label, String t1Url){
  171.         setPageDataTitle(pd,
  172.                 new Parameter(t1Label,t1Url));
  173.     }
  174.     public static void setPageDataTitle_ServletAdd(PageData pd,String t1Label, String t1Url){
  175.         setPageDataTitle(pd,
  176.                 new Parameter(t1Label,t1Url),
  177.                 new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_AGGIUNGI,null));
  178.     }  
  179.     public static void setPageDataTitle_ServletChange(PageData pd,String t1Label, String t1Url, String t2Label){
  180.         setPageDataTitle(pd,
  181.                 new Parameter(t1Label,t1Url),
  182.                 new Parameter(t2Label,null));
  183.     }

  184.     public static void setPageDataTitle(PageData pd, List<Parameter> listaParametri){
  185.         setPageDataTitle(pd, listaParametri.toArray(new Parameter[listaParametri.size()]));
  186.     }
  187.     public static void setPageDataTitle(PageData pd, Parameter ... param){
  188.         setPageDataTitle(pd,false,param);
  189.     }
  190.     public static void appendPageDataTitle(PageData pd, Parameter ... param){
  191.         setPageDataTitle(pd,true,param);
  192.     }
  193.     private static void setPageDataTitle(PageData pd, boolean append, Parameter ... param){

  194.         List<GeneralLink> titlelist = null;
  195.         if(!append){
  196.             titlelist = new ArrayList<>();
  197.         }
  198.         else{
  199.             titlelist = pd.getTitleList();
  200.         }

  201.         for (int i = 0; i < param.length; i++) {
  202.             GeneralLink tl = new GeneralLink();
  203.             if(param[i].getName()!=null){
  204.                 tl.setLabel(param[i].getName());
  205.             }
  206.             if(param[i].getValue()!=null){
  207.                 tl.setUrl(param[i].getValue());
  208.             }
  209.             titlelist.add(tl);
  210.         }

  211.         pd.setTitleList(titlelist);
  212.     }

  213.    
  214.    
  215.    
  216.     /* ------ PAGE DATA (DISABLE EDIT MODE) ---- */
  217.    
  218.     public static void disableEditMode(PageData pd){
  219.         pd.disableEditMode();
  220.     }
  221.    
  222.    
  223.     /* ------ PAGE DATA (SEARCH) ---- */
  224.    
  225.     public static void enabledPageDataSearch(PageData pd,String soggetto,String search){
  226.         pd.setSearch(Costanti.SEARCH_ENABLED);
  227.         pd.setSearchDescription(soggetto+" contenenti la stringa '" + search + "'");
  228.     }

  229.     public static void disabledPageDataSearch(PageData pd){
  230.         pd.setSearch(Costanti.SEARCH_DISABLED);
  231.     }





  232.     /* ------ DATA ELEMENT ---- */

  233.     public static void setDataElementVisualizzaLabel(DataElement de){
  234.         setDataElementVisualizzaLabel(de, null);
  235.     }
  236.     public static void setDataElementVisualizzaLabel(DataElement de,Long count){
  237.         if(count!=null){
  238.             de.setValue(Costanti.LABEL_VISUALIZZA+"(" + count + ")");
  239.         } else {
  240.             de.setValue(Costanti.LABEL_VISUALIZZA);
  241.         }
  242.     }

  243.     public static void setDataElementVisualizzaCustomLabel(DataElement de, String customLabel){
  244.         setDataElementVisualizzaCustomLabel(de, customLabel,null);
  245.     }
  246.     public static void setDataElementVisualizzaCustomLabel(DataElement de, String customLabel, Long count){
  247.         if(count!=null){
  248.             de.setValue(Costanti.LABEL_VISUALIZZA+ " "+customLabel+" (" + count + ")");
  249.         } else {
  250.             de.setValue(Costanti.LABEL_VISUALIZZA+ " "+customLabel );
  251.         }
  252.     }

  253.     public static void setDataElementCustomLabel(DataElement de, String customLabel){
  254.         setDataElementCustomLabel(de, customLabel,null,null);
  255.     }
  256.     public static void setDataElementCustomLabel(DataElement de, String customLabel,Long count){
  257.         setDataElementCustomLabel(de, customLabel,count,null);
  258.     }
  259.     public static void setDataElementCustomLabel(DataElement de, String customLabel,String msg){
  260.         setDataElementCustomLabel(de, customLabel,null,msg);
  261.     }
  262.     public static void setDataElementCustomLabel(DataElement de, String customLabel, Long count, String msg){
  263.         if(count!=null){
  264.             de.setValue(customLabel+" (" + count + ")");
  265.         } else if(msg!=null){
  266.             de.setValue(customLabel+" (" + msg + ")");
  267.         } else {
  268.             de.setValue(customLabel);
  269.         }
  270.     }
  271.    
  272.    
  273.     public static String getTabIdFromRequestAttribute(HttpServletRequest request)  {
  274.         Object idTabObj = request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  275.            
  276.         if(idTabObj != null)
  277.             return (String) idTabObj;
  278.        
  279.         return null;
  280.     }

  281.    
  282.     /* ------ SESSION ---- */
  283.    
  284.     public static void addListElementIntoSession(HttpServletRequest request, HttpSession session,String objectName, List<Parameter> parameters){
  285.         Parameter[] parameter = parameters != null ? parameters.toArray(new Parameter[parameters.size()]) : null;
  286.         addListElementIntoSession(request, session, objectName, parameter);
  287.     }

  288.     public static void addListElementIntoSession(HttpServletRequest request, HttpSession session,String objectName, Parameter ... parameter){
  289.         ListElement listElement = new ListElement();
  290.         listElement.setOggetto(objectName);
  291.         if(parameter!=null && parameter.length>0){
  292.             for (int i = 0; i < parameter.length; i++) {
  293.                 if(parameter[i].getValue()==null){
  294.                     listElement.addParameter(parameter[i].getName(), "");
  295.                 }else{
  296.                     listElement.addParameter(parameter[i].getName(), parameter[i].getValue());
  297.                 }
  298.             }
  299.         }
  300.         setObjectIntoSession(request, session, listElement, Costanti.SESSION_ATTRIBUTE_LIST_ELEMENT);
  301.     }

  302.     public static void setGeneralAndPageDataIntoSession(HttpServletRequest request, HttpSession session,GeneralData gd,PageData pd){
  303.         setGeneralAndPageDataIntoSession(request, session, gd, pd, false);
  304.     }
  305.     public static void setGeneralAndPageDataIntoSession(HttpServletRequest request, HttpSession session,GeneralData gd,PageData pd,boolean readOnlyDisabled){

  306.         //      if(readOnlyDisabled==false){
  307.         //          /*
  308.         //          CON UN UNICO INTERVENTO SI OTTIENE IL READ ONLY
  309.         //          
  310.         //          IN PRATICA RECUPERO L'UTENZA DALLA SESSIONE
  311.         //          SE POSSIEDE IL PERMESSO READ-ONLY ('R' indica che tutte le maschere visualizzate tramite gli altri permessi sono in read-only mode)
  312.         //          DEVE POI ESSERE GESTITA NEL FILTRO DI AUTORIZZAZIONE IL CONTROLLO CHE UN UNTENTE IN READ ONLY NON RICHIEDA UNA ELIMINAZIONE, UNA ADD O UNA MODIFICA
  313.         //          */
  314.         //          pd.disableEditMode();
  315.         //          pd.setAddButton(false);
  316.         //          pd.setRemoveButton(false);
  317.         //          pd.setSelect(false);
  318.         //          pd.setAreaBottoni(null);
  319.         //          pd.setBottoni(null);
  320.         //          pd.setInserisciBottoni(false);
  321.         //      }
  322.         //      
  323.         setObjectIntoSession(request, session, gd, Costanti.SESSION_ATTRIBUTE_GENERAL_DATA);
  324.         setObjectIntoSession(request, session, pd, Costanti.SESSION_ATTRIBUTE_PAGE_DATA);
  325.     }

  326.     public static PageData getPageDataFromSession(HttpServletRequest request, HttpSession session){
  327.         return getObjectFromSession(request, session, PageData.class, Costanti.SESSION_ATTRIBUTE_PAGE_DATA);
  328.     }

  329.     public static boolean existsSearchObjectFromSession(HttpServletRequest request, HttpSession session) {
  330.         return getObjectFromSession(request, session, ISearch.class, Costanti.SESSION_ATTRIBUTE_RICERCA) != null;
  331.     }
  332.    
  333.     public static ISearch getSearchObjectFromSession(HttpServletRequest request, HttpSession session, Class<?> searchImpl) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
  334.         ISearch ricerca = getObjectFromSession(request, session, ISearch.class, Costanti.SESSION_ATTRIBUTE_RICERCA);

  335.         if (ricerca == null) {
  336.             ricerca = (ISearch) ClassLoaderUtilities.newInstance(searchImpl);
  337.         }
  338.         return ricerca;
  339.     }
  340.     public static void setSearchObjectIntoSession(HttpServletRequest request, HttpSession session,ISearch ricerca){
  341.         setObjectIntoSession(request, session, ricerca, Costanti.SESSION_ATTRIBUTE_RICERCA);
  342.     }
  343.     public static void removeSearchObjectFromSession(HttpServletRequest request, HttpSession session){
  344.         removeObjectFromSession(request, session, ISearch.class, Costanti.SESSION_ATTRIBUTE_RICERCA);
  345.     }

  346.     public static String getSearchFromSession(ISearch ricerca, int idLista){
  347.         String search = (Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));
  348.         return search;
  349.     }

  350.     private static String getKeyRisultatiRicerca(int idLista) {
  351.         return Costanti.SESSION_ATTRIBUTE_RISULTATI_LISTA+"_"+idLista;
  352.     }
  353.     public static void setRisultatiRicercaIntoSession(HttpServletRequest request, HttpSession session, int idLista, List<?> risultatiRicerca){
  354.         setObjectIntoSession(request, session, risultatiRicerca, getKeyRisultatiRicerca(idLista));
  355.     }
  356.     @SuppressWarnings("unchecked")
  357.     public static <T> List<T> getRisultatiRicercaFromSession(HttpServletRequest request, HttpSession session, int idLista, Class<T> classType){
  358.         return getObjectFromSession(request, session, List.class, getKeyRisultatiRicerca(idLista));
  359.     }
  360.     public static List<?> removeRisultatiRicercaFromSession(HttpServletRequest request, HttpSession session, int idLista){
  361.         Object o = removeObjectFromSession(request, session, List.class, getKeyRisultatiRicerca(idLista));
  362.         if(o!=null) {
  363.             return (List<?>) o;
  364.         }
  365.         return null;
  366.     }
  367.    
  368.     public static String getUserLoginFromSession(HttpSession session){
  369.         String userLogin = (String) session.getAttribute(Costanti.SESSION_ATTRIBUTE_LOGIN);
  370.         return userLogin;
  371.     }
  372.     public static void setUserLoginIntoSession(HttpSession session,String userLogin){
  373.         session.setAttribute(Costanti.SESSION_ATTRIBUTE_LOGIN, userLogin);
  374.     }
  375.     public static void removeUserLoginFromSession(HttpSession session){
  376.         session.removeAttribute(Costanti.SESSION_ATTRIBUTE_LOGIN);
  377.     }

  378.     public static User getUserFromSession(HttpServletRequest request, HttpSession session){
  379.         return getObjectFromSession(request, session, User.class, Costanti.SESSION_ATTRIBUTE_USER);
  380.     }
  381.     public static void setUserIntoSession(HttpServletRequest request, HttpSession session,User user){
  382.         setObjectIntoSession(request, session, user, Costanti.SESSION_ATTRIBUTE_USER);
  383.     }
  384.     public static void removeUserFromSession(HttpServletRequest request, HttpSession session){
  385.         removeObjectFromSession(request, session, Costanti.SESSION_ATTRIBUTE_USER);
  386.     }

  387.     public static Boolean getContaListeFromSession(HttpSession session){
  388.         Boolean contaListe = (Boolean) session.getAttribute(Costanti.SESSION_ATTRIBUTE_CONTA_LISTE);
  389.         return contaListe;
  390.     }
  391.     public static void setContaListeIntoSession(HttpSession session,Boolean contaListe){
  392.         session.setAttribute(Costanti.SESSION_ATTRIBUTE_CONTA_LISTE, contaListe);
  393.     }
  394.     public static void removeContaListeFromSession(HttpSession session){
  395.         session.removeAttribute(Costanti.SESSION_ATTRIBUTE_CONTA_LISTE);
  396.     }

  397.     public static Boolean getConfigurazioniPersonalizzateFromSession(
  398.             HttpSession session) {
  399.         return(Boolean) session.getAttribute(Costanti.SESSION_ATTRIBUTE_CONFIGURAZIONI_PERSONALIZZATE);
  400.     }

  401.     public static BooleanNullable getBooleanAttributeFromSession(String attributeName, HttpSession session, HttpServletRequest request) {
  402.         return getBooleanAttributeFromSession(attributeName,session,request,null);
  403.     }
  404.     public static BooleanNullable getBooleanAttributeFromSession(String attributeName, HttpSession session, HttpServletRequest request, Boolean defaultValue) {
  405.         Boolean obj = getObjectFromSession(request, session, Boolean.class, attributeName);
  406. //      Object obj = session.getAttribute(attributeName);

  407.         if(obj == null) {
  408.             if(defaultValue==null) {
  409.                 return BooleanNullable.NULL();
  410.             }
  411.             else {
  412.                 return defaultValue ? BooleanNullable.TRUE() : BooleanNullable.FALSE();
  413.             }
  414.         }
  415.         else {
  416.             return obj ? BooleanNullable.TRUE() : BooleanNullable.FALSE();
  417.         }
  418.     }

  419.     @SuppressWarnings("unchecked")
  420.     public static void setObjectIntoSession(HttpServletRequest request, HttpSession session,Object obj, String objectName){
  421.         if(objectName.startsWith(Costanti.SESSION_ATTRIBUTE_TAB_KEY_PREFIX)) {
  422.             // lettura dalla sessione associata all'id del tab
  423.             String tabId = (String) request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  424.            
  425.             String prevTabId = request.getParameter(Costanti.PARAMETER_PREV_TAB_KEY);
  426.            
  427.             Map<String,Map<String, Object>> sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  428.            
  429.             if(sessionMap == null) {
  430.                 sessionMap = new ConcurrentHashMap<String, Map<String,Object>>();
  431.             }
  432.            
  433.             Map<String, Object> mapTabId = null;
  434.             if(sessionMap.containsKey(tabId)) {
  435.                 mapTabId = sessionMap.get(tabId);
  436.                
  437.             } else {
  438.                 // primo accesso copio le informazioni dalla mappa relativa al tab precedente
  439.                 copiaAttributiSessioneTab(session, prevTabId, tabId);
  440.                 sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  441.                 mapTabId = sessionMap.get(tabId);
  442.             }
  443.                
  444.             mapTabId.put(objectName, obj);
  445.            
  446.             session.setAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP,sessionMap);
  447.             return;
  448.         }
  449.        
  450.         session.setAttribute(objectName,obj);
  451.     }

  452.     public static void removeObjectFromSession(HttpServletRequest request, HttpSession session,String objectName){
  453.         removeObjectFromSession(request, session, null, objectName, false);
  454.     }
  455.    
  456.     @SuppressWarnings("unchecked")
  457.     public static <T> T getObjectFromSession(HttpServletRequest request, HttpSession session,Class<T> objectClass, String objectName){
  458.         if(objectName.startsWith(Costanti.SESSION_ATTRIBUTE_TAB_KEY_PREFIX)) {
  459.        
  460.             // lettura dalla sessione associata all'id del tab
  461.             String tabId = (String) request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  462.            
  463.             String prevTabId = request.getParameter(Costanti.PARAMETER_PREV_TAB_KEY);
  464.            
  465.             Map<String,Map<String, Object>> sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  466.            
  467.             if(sessionMap == null) {
  468.                 sessionMap = new ConcurrentHashMap<String, Map<String,Object>>();
  469.             }
  470.            
  471.             Map<String, Object> mapTabId = null;
  472.             if(sessionMap.containsKey(tabId)) {
  473.                 mapTabId = sessionMap.get(tabId);
  474.                
  475.             } else {
  476.                 // primo accesso copio le informazioni dalla mappa relativa al tab precedente
  477.                 copiaAttributiSessioneTab(session, prevTabId, tabId);
  478.                 sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  479.                 mapTabId = sessionMap.get(tabId);
  480.             }
  481.            
  482.             if(mapTabId.containsKey(objectName))
  483.                 return objectClass.cast(mapTabId.get(objectName));
  484.            
  485.             // leggi dall request
  486. //          if(request != null) {
  487. //              String parameterValue = request.getParameter(objectName);
  488. //              
  489. //              if(parameterValue != null) {
  490. //                  return objectClass.cast(parameterValue);
  491. //              }
  492. //          }
  493.         }
  494.        
  495.         // comportamento normale
  496.         Object obj = session.getAttribute(objectName);

  497.         if(obj == null)
  498.             return null;

  499.         return objectClass.cast(obj);
  500.     }
  501.    
  502.     @SuppressWarnings("unchecked")
  503.     public static Object getObjectFromSession(HttpServletRequest request, HttpSession session, String objectName){
  504.         if(objectName.startsWith(Costanti.SESSION_ATTRIBUTE_TAB_KEY_PREFIX)) {
  505.        
  506.             // lettura dalla sessione associata all'id del tab
  507.             String tabId = (String) request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  508.            
  509.             String prevTabId = request.getParameter(Costanti.PARAMETER_PREV_TAB_KEY);
  510.            
  511.             Map<String,Map<String, Object>> sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  512.            
  513.             if(sessionMap == null) {
  514.                 sessionMap = new ConcurrentHashMap<String, Map<String,Object>>();
  515.             }
  516.            
  517.             Map<String, Object> mapTabId = null;
  518.             if(sessionMap.containsKey(tabId)) {
  519.                 mapTabId = sessionMap.get(tabId);
  520.                
  521.             } else {
  522.                 // primo accesso copio le informazioni dalla mappa relativa al tab precedente
  523.                 copiaAttributiSessioneTab(session, prevTabId, tabId);
  524.                 sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  525.                 mapTabId = sessionMap.get(tabId);
  526.             }
  527.            
  528.             if(mapTabId.containsKey(objectName))
  529.                 return mapTabId.get(objectName);
  530.            
  531.             // leggi dall request
  532. //          if(request != null) {
  533. //              String parameterValue = request.getParameter(objectName);
  534. //              
  535. //              if(parameterValue != null) {
  536. //                  return objectClass.cast(parameterValue);
  537. //              }
  538. //          }
  539.         }
  540.        
  541.         // comportamento normale
  542.         Object obj = session.getAttribute(objectName);

  543.         return obj;
  544.     }
  545.    
  546.     public static String getStringAttributeFromSession(String attributeName, HttpSession session, HttpServletRequest request) {
  547.         return getObjectFromSession(request, session, String.class, attributeName);
  548.     }
  549.    
  550.     public static Integer getIntegerAttributeFromSession(String attributeName, HttpSession session, HttpServletRequest request) {
  551.         return getObjectFromSession(request, session, Integer.class, attributeName);
  552.     }
  553.    
  554.     @SuppressWarnings("unchecked")
  555.     public static void copiaAttributiSessioneTab(HttpSession session, String idSessioneTabSrc, String idSessioneTabDest) {
  556.         Map<String,Map<String, Object>> sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  557.        
  558.         if(sessionMap == null) {
  559.             sessionMap = new ConcurrentHashMap<String, Map<String,Object>>();
  560.         }
  561.        
  562.         Map<String, Object> mapDest = null;
  563.         if(StringUtils.isNotBlank(idSessioneTabSrc) && sessionMap.containsKey(idSessioneTabSrc)) { // identificativo del tab sorgente definito
  564.             // cerco una sessione da cui copiare altrimenti creo una sessione vuota
  565.             Map<String, Object> mapSrc = sessionMap.get(idSessioneTabSrc);
  566.             mapDest = (HashMap<String, Object>) SerializationUtils.clone(((HashMap<String, Object>)mapSrc));
  567.         } else { // se non ricevo un id tab provo a cercare l'ultima sessione creata altrimenti creo una sessione vuota
  568.             Date date = new Date(0l); // imposto una data molto vecchia
  569.             String idSessionTab = null;
  570.            
  571.             List<String> keys = new ArrayList<>();
  572.             for (String mapTabKey : sessionMap.keySet()) {
  573.                 keys.add(mapTabKey);
  574.             }
  575.            
  576.             for (String idSessioneTmp : keys) {
  577.                 Map<String, Object> mapTmp = sessionMap.get(idSessioneTmp);
  578.                 Date dTmp = (Date) mapTmp.get(Costanti.SESSION_ATTRIBUTE_TAB_MAP_CREATION_DATE);
  579.                
  580.                 if(dTmp.after(date)) { // il tab analizzato e' stato creato dopo
  581.                     date = dTmp; // salvo la data
  582.                     idSessionTab = idSessioneTmp; // salvo l'id del tab
  583.                 }
  584.             }
  585.            
  586.             if(idSessionTab != null) {
  587.                 Map<String, Object> mapSrc = sessionMap.get(idSessionTab);
  588.                 // in questo ramo devo riconoscere se ho cliccato su un tab dopo che e' scaduta la sessione, ma e' stato fatto login in un tab diverso
  589.                 // in questo caso mi arrivano entrambi gli id ma non e' stato trovato una mappa sorgente nella lista delle mappe salvate
  590.                 // gli id possono essere uguali = clic sullo stesso tab
  591.                 // gli id possono non coincidere = apertura di un nuovo tab da un tab scaduto
  592.                 if(idSessioneTabSrc != null && idSessioneTabDest != null) {
  593.                     mapDest = new HashMap<>(); // nuova mappa dopo click su tab dove non e' stata rinnovata la sessione
  594.                     // vengono riportati gli attributi relativi all'utenza collegata
  595.                     if(mapSrc.containsKey(Costanti.SESSION_ATTRIBUTE_USER)) {
  596.                         mapDest.put(Costanti.SESSION_ATTRIBUTE_USER, mapSrc.get(Costanti.SESSION_ATTRIBUTE_USER));
  597.                     }
  598.                     // page data
  599.                     if(mapSrc.containsKey(Costanti.SESSION_ATTRIBUTE_PAGE_DATA)) {
  600.                         mapDest.put(Costanti.SESSION_ATTRIBUTE_PAGE_DATA, mapSrc.get(Costanti.SESSION_ATTRIBUTE_PAGE_DATA));
  601.                     }
  602.                     // general data
  603.                     if(mapSrc.containsKey(Costanti.SESSION_ATTRIBUTE_GENERAL_DATA)) {
  604.                         mapDest.put(Costanti.SESSION_ATTRIBUTE_GENERAL_DATA, mapSrc.get(Costanti.SESSION_ATTRIBUTE_GENERAL_DATA));
  605.                     }
  606.                    
  607.                     // attributo che indica l'id del tab con la sessione su cui fare refresh
  608.                     mapDest.put(Costanti.SESSION_ATTRIBUTE_TAB_MAP_REFRESH_TAB_ID, idSessioneTabDest);
  609.                 } else {
  610.                     mapDest = (HashMap<String, Object>) SerializationUtils.clone(((HashMap<String, Object>)mapSrc)); // mappa clonata dalla piu' vecchia sessione creata
  611.                 }
  612.             } else {
  613.                 mapDest = new HashMap<>(); // nuova mappa dopo login.
  614.                 mapDest.put(Costanti.SESSION_ATTRIBUTE_TAB_MAP_CREATION_TAB_ID, idSessioneTabDest); // salvo l'identificativo del tab che ha creato la sessione
  615.             }
  616.         }
  617.        
  618.         //salvo la data di creazione del tab
  619.         mapDest.put(Costanti.SESSION_ATTRIBUTE_TAB_MAP_CREATION_DATE, new Date());
  620.         // creo il primo token CSFR per il tab
  621.         mapDest.put(Costanti.SESSION_ATTRIBUTE_CSRF_TOKEN, generaTokenCSRF(idSessioneTabDest));
  622.        
  623.         sessionMap.put(idSessioneTabDest, mapDest);
  624.        
  625.         session.setAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP, sessionMap);
  626.     }
  627.    
  628.     public static <T> T removeObjectFromSession(HttpServletRequest request, HttpSession session,Class<T> objectClass, String objectName){
  629.         return removeObjectFromSession(request, session, objectClass, objectName, true);
  630.     }
  631.     @SuppressWarnings("unchecked")
  632.     private static <T> T removeObjectFromSession(HttpServletRequest request, HttpSession session,Class<T> objectClass, String objectName, boolean returnValue){
  633.         if(objectName.startsWith(Costanti.SESSION_ATTRIBUTE_TAB_KEY_PREFIX)) {
  634.            
  635.             // lettura dalla sessione associata all'id del tab
  636.             String tabId = (String) request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  637.            
  638.             Map<String,Map<String, Object>> sessionMap = (Map<String,Map<String, Object>>) session.getAttribute(Costanti.SESSION_ATTRIBUTE_TAB_KEYS_MAP);
  639.            
  640.             if(sessionMap == null) {
  641.                 sessionMap = new ConcurrentHashMap<String, Map<String,Object>>();
  642.             }
  643.            
  644.             List<String> keys = new ArrayList<>();
  645.             for (String mapTabKey : sessionMap.keySet()) {
  646.                 keys.add(mapTabKey);
  647.             }
  648.            
  649.             Object obj = null;
  650.             // la remove deve essere fatta da tutti i tab session
  651.             for (String mapTabKey : keys) {
  652.                 Map<String, Object> mapTabId = sessionMap.get(mapTabKey);
  653.                 // se il tab e' quello corrente allora restituisco anche l'oggetto
  654.                 if(tabId.equals(mapTabKey)) {
  655.                     obj = mapTabId.remove(objectName);
  656.                 } else {
  657.                     mapTabId.remove(objectName);
  658.                 }
  659.             }
  660.            
  661.             if(obj != null && returnValue) {
  662.                 return objectClass.cast(obj);
  663.             }
  664.         }
  665.        
  666.         // comportamento normale
  667.         Object obj = session.getAttribute(objectName);

  668.         if(obj != null) {
  669.        
  670.             session.removeAttribute(objectName);
  671.    
  672.             if(returnValue) {
  673.                 return objectClass.cast(obj);
  674.             }
  675.         }
  676.         return null;
  677.     }

  678.     public static String getParametersAsString(boolean createFirstParameter, Parameter ... parameter ) {
  679.         StringBuilder sb = new StringBuilder();
  680.         if(parameter!=null && parameter.length>0){
  681.             if(createFirstParameter)
  682.                 sb.append("?");
  683.             else
  684.                 sb.append("&");

  685.             for (int i = 0; i < parameter.length; i++) {
  686.                 if(i>0){
  687.                     sb.append("&");
  688.                 }
  689.                 sb.append(parameter[i].toString());
  690.             }
  691.         }

  692.         return sb.toString();
  693.     }

  694.     public static void removeCookieFromResponse(String cookieName, HttpServletRequest request, HttpServletResponse response){
  695.         Cookie[] cookies = request.getCookies();

  696.         if(cookies != null){
  697.             for(int i = 0; i< cookies.length ; ++i){
  698.                
  699.                 if(cookies[i].getName().equalsIgnoreCase(cookieName)){
  700. //                  Cookie cookie = new Cookie(cookies[i].getName(), cookies[i].getValue());
  701. //                  cookie.setMaxAge(0);
  702. //                  response.addCookie(cookie);
  703.                     String contextPath = request.getContextPath();
  704.                     cookies[i].setPath(contextPath);
  705.                     cookies[i].setMaxAge(0);
  706.                     cookies[i].setValue("NO_DATA");
  707.                     cookies[i].setVersion(0);
  708.                     response.addCookie(cookies[i]);
  709.                     break;
  710.                 }
  711.             }
  712.         }
  713.     }
  714.    
  715.     public static void saveConfigurazioneBeanIntoSession(HttpServletRequest request, HttpSession session,ConfigBean configurazioneBean, String objectName){
  716.         setObjectIntoSession(request, session, configurazioneBean, Costanti.SESSION_PARAMETRO_OLD_CONFIGURAZIONE_PROPERTIES_PREFIX + objectName);
  717.     }
  718.    
  719.     public static void removeConfigurazioneBeanFromSession(HttpServletRequest request, HttpSession session,String objectName){
  720.         removeObjectFromSession(request, session, Costanti.SESSION_PARAMETRO_OLD_CONFIGURAZIONE_PROPERTIES_PREFIX +  objectName);
  721.     }

  722.     public static ConfigBean readConfigurazioneBeanFromSession(HttpServletRequest request, HttpSession session, String objectName){
  723.         return getObjectFromSession(request, session, ConfigBean.class, Costanti.SESSION_PARAMETRO_OLD_CONFIGURAZIONE_PROPERTIES_PREFIX + objectName);
  724.     }
  725.    
  726.    
  727.    
  728.    
  729.     /* ------ IN USO ---- */
  730.    
  731.     public static void addInUsoButton(String servletName, List<DataElement> e, DataElementType deType, String titolo, String id, String inUsoType,
  732.             String tooltip, String icon, String headerRiga1,
  733.             Boolean resizable, Boolean draggable, boolean contextMenu) {
  734.         DataElement de = new DataElement();
  735.         de.setType(deType);
  736.         de.setToolTip(tooltip);
  737.         de.setWidthPx(15);  
  738.         de.setContextMenu(contextMenu);
  739.         Dialog deDialog = new Dialog();
  740.         deDialog.setIcona(icon);
  741.         deDialog.setTitolo(titolo);
  742.         deDialog.setHeaderRiga1(headerRiga1);
  743.         if(resizable!=null) {
  744.             deDialog.setResizable(resizable);
  745.         }
  746.         if(draggable!=null) {
  747.             deDialog.setDraggable(draggable);
  748.         }
  749.         deDialog.setWidth("800px"); // modifico il default, che è più piccolo e calibrato per la creazione delle credenziali
  750.        
  751.         // Inserire sempre la url utilizzando la funzione setUrlElement
  752.         BodyElement bodyElementURL = new Dialog().new BodyElement();
  753.         bodyElementURL.setType(DataElementType.HIDDEN);
  754.         bodyElementURL.setName(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_URL);
  755.         Parameter pIdOggetto = new Parameter(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_ID_OGGETTO, id);
  756.         Parameter pTipoOggetto = new Parameter(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_OGGETTO, inUsoType);
  757.         Parameter pTipoRisposta = new Parameter(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_RISPOSTA, Costanti.VALUE_PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_RISPOSTA_TEXT);
  758.         bodyElementURL.setUrl(servletName, pIdOggetto,pTipoOggetto,pTipoRisposta);
  759.         deDialog.setUrlElement(bodyElementURL);
  760.        
  761.         // TextArea
  762.         BodyElement bodyElement = new Dialog().new BodyElement();
  763.         bodyElement.setType(DataElementType.TEXT_AREA);
  764.         bodyElement.setLabel("");
  765.         bodyElement.setValue("");
  766.         bodyElement.setRows(15);
  767.         if(resizable!=null) {
  768.             bodyElement.setResizable(resizable);
  769.         }
  770.         deDialog.addBodyElement(bodyElement );
  771.        
  772.         de.setDialog(deDialog );
  773.         e.add(de);
  774.     }
  775.    
  776.     public static void addAjaxButton(List<DataElement> e, DataElementType deType, String icon, String tooltip, String titolo, String body, boolean contextMenu, String servletName, List<Parameter> parameters, String inUsoType) {
  777.         DataElement de = new DataElement();
  778.         de.setType(deType);
  779.         de.setIcon(icon);
  780.         de.setToolTip(tooltip);
  781.         de.setWidthPx(15);  
  782.         de.setContextMenu(contextMenu);
  783.         if(parameters == null) {
  784.             parameters = new ArrayList<>();
  785.         }
  786.         parameters.add(new Parameter(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_OGGETTO, inUsoType));
  787.         parameters.add(new Parameter(Costanti.PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_RISPOSTA, Costanti.VALUE_PARAMETRO_INFORMAZIONI_UTILIZZO_OGGETTO_TIPO_RISPOSTA_TEXT));
  788.        
  789.         de.setUrl(servletName, parameters.toArray(new Parameter[parameters.size()]));
  790.        
  791.         DataElementConfirm confirm = new DataElementConfirm();
  792.         confirm.setTitolo(titolo);
  793.         confirm.setBody(body);
  794.         de.setConfirm(confirm );
  795.        
  796.         e.add(de);
  797.     }
  798.    
  799.     public static void generaESalvaTokenCSRF(HttpServletRequest request, HttpSession session) {
  800. //      String tabId = (String) request.getAttribute(Costanti.PARAMETER_TAB_KEY);
  801.         String uuId = UUID.randomUUID().toString().replace("-", "");
  802.         String nuovoToken = generaTokenCSRF(uuId);
  803.         setObjectIntoSession(request, session, nuovoToken, Costanti.SESSION_ATTRIBUTE_CSRF_TOKEN);
  804.     }

  805.     public static String generaTokenCSRF(String sessionTabID) {
  806.         String nuovoToken = sessionTabID + "_" + System.currentTimeMillis();
  807.         return nuovoToken;
  808.     }
  809.    
  810.     public static String leggiTokenCSRF(HttpServletRequest request, HttpSession session) {
  811.         return getObjectFromSession(request, session, String.class, Costanti.SESSION_ATTRIBUTE_CSRF_TOKEN);
  812.     }
  813.    
  814.     public static boolean verificaTokenCSRF(String tokenToCheck, HttpServletRequest request, HttpSession session, Integer validitaTokenCsrf) {
  815.         String csfrTokenFromSession = ServletUtils.leggiTokenCSRF(request, session);
  816.         return verificaTokenCSRF(tokenToCheck, csfrTokenFromSession, validitaTokenCsrf);
  817.     }
  818.    
  819.     public static boolean verificaTokenCSRF(String tokenToCheck, String csfrTokenFromSession, Integer validitaTokenCsrf) {
  820.         // non ho trovato il token nella request non passo il controllo
  821.         if(tokenToCheck == null) return false;
  822.        
  823.         // controllo che il token coincida per intero con quello salvato in sessione
  824.         if(!tokenToCheck.equals(csfrTokenFromSession)) return false;
  825.        
  826.         // Controllo scadenza del token in base alla soglia impostata nelle properties
  827.         if(validitaTokenCsrf != null) {
  828.             String[] split = tokenToCheck.split("_");
  829.             String millisSToCheck = split[1];
  830.            
  831.             long sogliaMS = validitaTokenCsrf.longValue() * 1000;
  832.             long now = System.currentTimeMillis() ;
  833.             long rif = sogliaMS + Long.parseLong(millisSToCheck);
  834.            
  835.             return now < rif;
  836.         }
  837.        
  838.         return true;
  839.     }
  840.    
  841.     public static String getJsonPair(String key, String val) {
  842.         StringBuilder sb = new StringBuilder();
  843.         sb.append(Costanti.CHAR_QUOTA_JSON).append(key).append(Costanti.CHAR_QUOTA_JSON).append(Costanti.CHAR_DUE_PUNTI_JSON);
  844.         if(val != null) {
  845.             sb.append(Costanti.CHAR_QUOTA_JSON).append(val).append(Costanti.CHAR_QUOTA_JSON);
  846.         } else {
  847.             sb.append(Costanti.NULL_VALUE_JSON);
  848.         }
  849.         return sb.toString();
  850.     }
  851.    
  852.     public static String getJson(String ... pairs) {
  853.         StringBuilder sb = new StringBuilder();
  854.         sb.append(Costanti.CHAR_APERTURA_JSON);
  855.        
  856.         if(pairs != null) {
  857.             for (int i = 0; i < pairs.length; i++) {
  858.                 if(i > 0) {
  859.                     sb.append(Costanti.CHAR_VIRGOLA_JSON);
  860.                 }
  861.                 sb.append(pairs[i]);
  862.             }
  863.         }
  864.        
  865.         sb.append(Costanti.CHAR_CHIUSURA_JSON);
  866.         return sb.toString();
  867.     }
  868.    
  869.     public static void setErrorStatusCodeInRequestAttribute(HttpServletRequest request, HttpStatus httpStatus){
  870.         request.setAttribute(Costanti.REQUEST_ATTRIBUTE_SET_ERROR_CODE, httpStatus);
  871.     }
  872. }