@ModelAttribute("navigaProgetti")
 public NavigaProgetti modelAttrNavigaProgetti() {
   NavigaProgetti navigaProgetti = new NavigaProgetti();
   String idNatura =
       (aggregataFacade.findNaturaByCod(codiNaturaOpenCUP) == null)
           ? "0"
           : aggregataFacade.findNaturaByCod(codiNaturaOpenCUP).getId().toString();
   navigaProgetti.setIdNatura(idNatura);
   return navigaProgetti;
 }
  @RenderMapping
  public String handleRenderRequest(
      RenderRequest renderRequest,
      RenderResponse renderResponse,
      Model model,
      @ModelAttribute("navigaProgetti") NavigaProgetti navigaProgetti,
      @RequestParam(required = false, value = "jsonnavigaaggregata") String jsonnavigaaggregata) {

    if (!StringUtils.isEmpty(jsonnavigaaggregata)) {
      NavigaAggregata navigaAggregata = createModelAggregataFromJsonString(jsonnavigaaggregata);
      navigaProgetti.importa(navigaAggregata);
    }
    navigaProgetti.setCurrentAction("elencoProgetti");

    return elencoProgettiRenderRequest(renderRequest, renderResponse, model, navigaProgetti);
  }
  @ActionMapping(params = "action=dettaglio")
  public void actionDettaglio(
      ActionRequest aRequest,
      ActionResponse aResponse,
      Model model,
      @ModelAttribute("navigaProgetti") NavigaProgetti navigaProgetti,
      @RequestParam(value = "idProgettoDettaglio") String idProgettoDettaglio,
      @RequestParam(value = "currentAction") String currentAction,
      @RequestParam(required = false, value = "cercaPerKeyword") String cercaPerKeyword) {

    navigaProgetti.setIdProgetto(idProgettoDettaglio);
    LiferayPortletURL renderURL =
        createLiferayPortletURL(aRequest, paginaDettaglioProgetto, dettaglioProgettoInstanceId);

    renderURL.setParameter("idPj", idProgettoDettaglio);

    try {

      ThemeDisplay themeDisplay = (ThemeDisplay) aRequest.getAttribute(WebKeys.THEME_DISPLAY);
      PortletURL returnURL =
          PortletURLFactoryUtil.create(
              aRequest,
              (String) aRequest.getAttribute(WebKeys.PORTLET_ID),
              themeDisplay.getLayout().getPlid(),
              PortletRequest.RENDER_PHASE);
      returnURL.setWindowState(WindowState.NORMAL);
      returnURL.setPortletMode(PortletMode.VIEW);
      // returnURL.setParameter("jsonnavigaprogetti",
      // createJsonStringFromModelAttribute(navigaProgetti));
      returnURL.setParameter("action", currentAction);
      if (!StringUtils.isEmpty(cercaPerKeyword)) {
        returnURL.setParameter("cercaPerKeyword", cercaPerKeyword);
      }

      renderURL.setParameter("returnUrl", returnURL.toString());

    } catch (Exception e) {
      e.printStackTrace();
    }

    try {
      aResponse.sendRedirect(
          HttpUtil.encodeParameters(
              renderURL.toString())); //  + "&idPj="+navigaProgetti.getIdProgetto() ) );
      return;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @RenderMapping(params = "action=ricercaAvanzata")
  public String effettuaRicercaAvanzata(
      RenderRequest renderRequest,
      RenderResponse renderResponse,
      Model model,
      @ModelAttribute("navigaProgetti") NavigaProgetti navigaProgetti,
      @RequestParam("cercaPerKeyword") String cercaPerKeyword) {

    model.addAttribute("currentAction", "ricercaAvanzata");
    navigaProgetti.setCurrentAction("ricercaAvanzata");

    model.addAttribute("paginate", "false");

    model.addAttribute("navigaProgetti", navigaProgetti);
    model.addAttribute("valoreRicercaValido", "NO");

    // MASCHERA RICERCA PROGETTI //
    initInModelMascheraRicerca(model, navigaProgetti);

    model.addAttribute("navigaProgetti", navigaProgetti);
    // FINE RICERCA PROGETTI //

    return "elenco-progetti-view";
  }
  private void initInModelMascheraRicerca(Model model, NavigaProgetti filtro) {

    // Carico la lista delle regioni
    List<AreaGeografica> listAreaGeografica = aggregataFacade.findAreaGeografica();
    model.addAttribute("listAreaGeografica", listAreaGeografica);

    if ((!"-1".equals(filtro.getIdAreaGeografica()))
        && (!"0".equals(filtro.getIdAreaGeografica()))) {
      // Regione selezionata carico le Province
      List<Regione> listRegione =
          aggregataFacade.findRegioniByIdAreaGeografica(
              Integer.valueOf(filtro.getIdAreaGeografica()));
      model.addAttribute("listRegione", listRegione);
    }

    if ((!"-1".equals(filtro.getIdRegione())) && (!"0".equals(filtro.getIdRegione()))) {
      // Regione selezionata carico le Province
      List<Provincia> listProvincia =
          aggregataFacade.findProvinciaByIdRegione(Integer.valueOf(filtro.getIdRegione()));
      model.addAttribute("listProvincia", listProvincia);
    }

    if ((!"-1".equals(filtro.getIdProvincia())) && (!"0".equals(filtro.getIdProvincia()))) {
      // Provincia selezionata carico i Comuni
      List<Comune> listComune =
          aggregataFacade.findComuneByIdProvincia(Integer.valueOf(filtro.getIdProvincia()));
      model.addAttribute("listComune", listComune);
    }

    // Carico la lista degli Anni Decisione
    List<AnnoDecisione> listaAnnoDecisione = aggregataFacade.findAnniDecisione();
    model.addAttribute("listaAnnoDecisione", listaAnnoDecisione);

    // Carico la lista delle Tipologia Intervento
    List<TipologiaIntervento> listaTipologiaIntervento = aggregataFacade.findTipologiaIntervento();
    model.addAttribute("listaTipologiaIntervento", listaTipologiaIntervento);

    // Carico la lista degli Stato Progetto
    List<StatoProgetto> listaStatoProgetto = aggregataFacade.findStatoProgetto();
    model.addAttribute("listaStatoProgetto", listaStatoProgetto);

    // Carico la lista della Aree Soggetto
    List<AreaSoggetto> listAreaSoggetto = aggregataFacade.findAreaSoggetto();
    model.addAttribute("listAreaSoggetto", listAreaSoggetto);

    if ((!"-1".equals(filtro.getIdAreaSoggetto())) && (!"0".equals(filtro.getIdAreaSoggetto()))) {
      // Carico la lista della Categoria Soggetto
      List<CategoriaSoggetto> listCategoriaSoggetto =
          aggregataFacade
              .findCategoriaSoggettoByIdAreaSoggetto(); // Integer.valueOf(
                                                        // filtro.getIdAreaSoggetto() ));
      model.addAttribute("listCategoriaSoggetto", listCategoriaSoggetto);
    }

    if ((!"-1".equals(filtro.getIdCategoriaSoggetto()))
        && (!"0".equals(filtro.getIdCategoriaSoggetto()))) {
      // Carico la lista della Sottocategoria Soggetto
      List<SottocategoriaSoggetto> listSottoCategoriaSoggetto =
          aggregataFacade.findSottocategoriaSoggetto(
              Integer.valueOf(filtro.getIdCategoriaSoggetto()));
      model.addAttribute("listSottoCategoriaSoggetto", listSottoCategoriaSoggetto);
    }

    // Carico le Aree d'intervednto
    List<AreaIntervento> listAreaIntervento = aggregataFacade.findAreaIntervento();
    model.addAttribute("listAreaIntervento", listAreaIntervento);

    if ((!"-1".equals(filtro.getIdAreaIntervento()))
        && (!"0".equals(filtro.getIdAreaIntervento()))) {
      // Settore intervento selezionata carico i sottosettori
      List<SottosettoreIntervento> listSottosettoreIntervento =
          aggregataFacade.findSottosettoreByArea(Integer.valueOf(filtro.getIdAreaIntervento()));
      model.addAttribute("listSottosettoreIntervento", listSottosettoreIntervento);
    }

    if (((!"-1".equals(filtro.getIdAreaIntervento()))
            && (!"-1".equals(filtro.getIdSottosettoreIntervento())))
        && ((!"0".equals(filtro.getIdAreaIntervento()))
            && (!"0".equals(filtro.getIdSottosettoreIntervento())))) {
      // Settore intervento e sottosettore intervento selezionati carico le categorie
      List<CategoriaIntervento> listaCategoriaIntervento =
          aggregataFacade.findCategoriaInterventoByAreaSottosettore(
              Integer.valueOf(filtro.getIdAreaIntervento()),
              Integer.valueOf(filtro.getIdSottosettoreIntervento()));
      model.addAttribute("listaCategoriaIntervento", listaCategoriaIntervento);
    }
  }
  @RenderMapping(params = "action=ricercaLibera")
  public String effettuaRicerca(
      RenderRequest renderRequest,
      RenderResponse renderResponse,
      Model model,
      @ModelAttribute("navigaProgetti") NavigaProgetti navigaProgetti,
      @RequestParam("cercaPerKeyword") String cercaPerKeyword) {

    model.addAttribute("currentAction", "ricercaLibera");
    navigaProgetti.setCurrentAction("ricercaLibera");

    model.addAttribute("cercaPerKeyword", cercaPerKeyword);
    model.addAttribute("navigaProgetti", navigaProgetti);

    logger.info("effettuaRicerca.cercaPerKeyword: " + cercaPerKeyword);
    try {

      Document[] documents = null;
      List<DocumentoDTO> risultatiGenerici = new ArrayList<DocumentoDTO>();
      List<Progetto> risultatiProgetti = new ArrayList<Progetto>();

      if (cercaPerKeyword != null && cercaPerKeyword.length() > 3) {
        Query query =
            StringQueryFactoryUtil.create(
                Field.TITLE
                    + ":"
                    + cercaPerKeyword
                    + " or "
                    + Field.CONTENT
                    + ":"
                    + cercaPerKeyword
                    + " or "
                    + Constants.RICERCALIBERA_FIELD_SEARCH
                    + ":"
                    + cercaPerKeyword
                    + " or "
                    + Constants.RICERCALIBERA_FIELD_LOCALIZZAZIONE
                    + ":"
                    + cercaPerKeyword
                    + " or "
                    + Constants.RICERCALIBERA_FIELD_CODICE_CUP
                    + ":"
                    + cercaPerKeyword);

        logger.debug("query = " + query.toString());

        Hits hits =
            SearchEngineUtil.search(
                SearchEngineUtil.SYSTEM_ENGINE_ID, PortalUtil.getDefaultCompanyId(), query, -1, -1);

        logger.info("hits = " + hits.getLength());
        documents = hits.getDocs();
        model.addAttribute("valoreRicercaValido", "SI");
      } else {
        SessionMessages.add(renderRequest, "valore-ricerca-non-valido");
        model.addAttribute("valoreRicercaValido", "NO");
      }

      if (documents != null) {
        DocumentoDTO documento = null;
        Progetto progetto = null;
        int contaDoc = 0;
        for (Document document : documents) {
          logger.debug("Document: " + document.getUID());

          //					for (Map.Entry<String, Field> entry : document.getFields().entrySet() ) {
          //						logger.debug("-- " +  entry.getKey() + ": " + entry.getValue().getValue() );
          //					}

          if (document.get(Field.ENTRY_CLASS_NAME).equals(Progetto.class.getName())) {

            progetto = getProgettoFromDocument(document);
            risultatiProgetti.add(progetto);

          } else {

            documento = new DocumentoDTO();
            documento.setTitolo(document.getField(Field.TITLE).getValue());
            String testo = "non disponibile";
            if (document.getField(Field.CONTENT) != null) {
              testo = trunc(document.getField(Field.CONTENT).getValue(), 37);
            }
            documento.setTesto(testo);
            documento.setId(contaDoc++);

            AssetEntry assetEntry =
                AssetEntryLocalServiceUtil.getEntry(
                    document.get(Field.ENTRY_CLASS_NAME),
                    Long.parseLong(document.get(Field.ENTRY_CLASS_PK)));
            documento.setUrl(
                getAssetViewURL(renderRequest, renderResponse, assetEntry, cercaPerKeyword));

            risultatiGenerici.add(documento);
          }
        }
      }

      // model.addAttribute("risultatiGenerici", risultatiGenerici);
      model.addAttribute("risultatiGenericiSize", risultatiGenerici.size());

      SearchContainer<DocumentoDTO> searchContainerElencoDoc =
          new SearchContainer<DocumentoDTO>(
              renderRequest,
              renderResponse.createRenderURL(),
              null,
              "Nessun dato trovato per la selezione fatta");
      searchContainerElencoDoc.setDelta(risultatiGenerici.size());
      searchContainerElencoDoc.setTotal(risultatiGenerici.size());
      searchContainerElencoDoc.setResults(risultatiGenerici);
      model.addAttribute("searchContainerElencoDoc", searchContainerElencoDoc);

      // model.addAttribute("risultatiProgetti", risultatiProgetti);
      SearchContainer<Progetto> searchContainerElencoPro =
          new SearchContainer<Progetto>(
              renderRequest,
              renderResponse.createRenderURL(),
              null,
              "Nessun dato trovato per la selezione fatta");
      searchContainerElencoPro.setDelta(risultatiProgetti.size());
      searchContainerElencoPro.setTotal(risultatiProgetti.size());
      searchContainerElencoPro.setResults(risultatiProgetti);
      model.addAttribute("searchContainerElenco", searchContainerElencoPro);

    } catch (SearchException e) {
      logger.error("SearchException: ", e);
    } catch (NumberFormatException e) {
      logger.error("NumberFormatException: ", e);
    } catch (PortalException e) {
      logger.error("PortalException: ", e);
    } catch (SystemException e) {
      logger.error("SystemException: ", e);
    }

    return "elenco-progetti-view";
  }
  @RenderMapping(params = "action=elencoProgetti")
  public String elencoProgettiRenderRequest(
      RenderRequest renderRequest,
      RenderResponse renderResponse,
      Model model,
      @ModelAttribute("navigaProgetti") NavigaProgetti navigaProgetti) {
    // ,@RequestParam(required=false, value="jsonnavigaprogetti") String jsonnavigaprogetti){

    // if(!StringUtils.isEmpty(jsonnavigaprogetti)){
    //	navigaProgetti = createModelProgettiFromJsonString(jsonnavigaprogetti);
    // }

    if (StringUtils.isEmpty(navigaProgetti.getCurrentAction())) {
      navigaProgetti.setCurrentAction("elencoProgetti");
    }

    model.addAttribute("currentAction", navigaProgetti.getCurrentAction());
    model.addAttribute("paginate", "true");

    // LISTA PROGETTI //
    // orderByCol is the column name passed in the request while sorting
    String orderByCol = ParamUtil.getString(renderRequest, "orderByCol");
    if (Validator.isNull(orderByCol) || Validator.equals("", orderByCol)) {
      orderByCol = "impoCostoProgetto";
    }

    // orderByType is passed in the request while sorting. It can be either asc or desc
    String orderByType = ParamUtil.getString(renderRequest, "orderByType");
    if (Validator.isNull(orderByType) || Validator.equals("", orderByType)) {
      orderByType = "desc";
    }

    // delta
    String sDelta = ParamUtil.getString(renderRequest, "delta");
    int delta = maxResult;
    if (!(Validator.isNull(sDelta) || Validator.equals("", sDelta))) {
      delta = Integer.parseInt(sDelta);
    }

    SearchContainer<Progetto> searchContainerElenco =
        new SearchContainer<Progetto>(
            renderRequest,
            renderResponse.createRenderURL(),
            null,
            "Nessun dato trovato per la selezione fatta");
    searchContainerElenco.setDelta(delta);

    searchContainerElenco.setOrderByCol(orderByCol);
    searchContainerElenco.setOrderByType(orderByType);

    // int size =  progettoFacade.sizeElencoProgetti( navigaProgetti ).getSize();

    navigaProgetti.setOrderByCol(searchContainerElenco.getOrderByCol());
    navigaProgetti.setOrderByType(searchContainerElenco.getOrderByType());
    navigaProgetti.setStart(searchContainerElenco.getStart());
    navigaProgetti.setDelta(delta);

    List<Progetto> elencoProgetti4Pag = progettoFacade.findElencoProgetti(navigaProgetti);
    // int size =  elencoProgetti.size();
    /*
    searchContainerElenco.setTotal(size);
    int fromIndex = searchContainerElenco.getStart();
    int toIndex = (((searchContainerElenco.getStart() + delta) > size)?size:(searchContainerElenco.getStart() + delta)) - 1;

    System.out.println( fromIndex );
    System.out.println( toIndex );

    List<Progetto> elencoProgetti4Pag = new ArrayList<Progetto>();
    for( Progetto tmp : elencoProgetti.subList(fromIndex, toIndex) ){
    	if( tmp.getAnagraficaCup().getFkDcupDcupIdMaster() != null ){
    		tmp.getAnagraficaCup().setAnagraficaCup(
    				progettoFacade.findAnagraficaCupById( tmp.getAnagraficaCup().getFkDcupDcupIdMaster() ) );
    	}
    	elencoProgetti4Pag.add(tmp);
    }
    */
    searchContainerElenco.setResults(elencoProgetti4Pag);

    model.addAttribute("pagDettaglioProgetto", paginaDettaglioProgetto);
    // FINE LISTA PROGETTI //

    // MASCHERA RICERCA PROGETTI //
    initInModelMascheraRicerca(model, navigaProgetti);
    model.addAttribute("navigaProgetti", navigaProgetti);
    // FINE RICERCA PROGETTI //

    // RIEPILOGO //
    // DATI TOTALI

    NavigaAggregata navigaAggregata = new NavigaAggregata();
    String idNatura =
        (aggregataFacade.findNaturaByCod(codiNaturaOpenCUP) == null)
            ? "0"
            : aggregataFacade.findNaturaByCod(codiNaturaOpenCUP).getId().toString();
    navigaAggregata.setIdNatura(idNatura);
    List<AggregataDTO> listaAggregataDTO = aggregataFacade.findAggregataByNatura(navigaAggregata);
    NavigaProgetti navigaProgettitot = new NavigaProgetti();
    navigaProgettitot.setIdNatura(idNatura);

    Double impoCostoProgetti = 0.0;
    Double impoImportoFinanziato = 0.0;

    long sizetot = 0; // progettoFacade.sizeElencoProgetti( navigaProgettitot ).getSize();

    for (AggregataDTO aggregataDTO : listaAggregataDTO) {
      impoCostoProgetti = impoCostoProgetti + aggregataDTO.getImpoCostoProgetti();
      impoImportoFinanziato = impoImportoFinanziato + aggregataDTO.getImpoImportoFinanziato();
      sizetot = sizetot + aggregataDTO.getNumeProgetti();
    }

    model.addAttribute("volumeDeiProgetti", sizetot);
    model.addAttribute("costoDeiProgetti", impoCostoProgetti);
    model.addAttribute("importoFinanziamenti", impoImportoFinanziato);

    //		if( size > (delta*2)){
    //			navigaAggregata = new NavigaAggregata();
    //			navigaAggregata.setIdNatura(idNatura);
    //			navigaAggregata.importa( navigaProgetti );
    //			//Gestione ANNI
    //			if( navigaProgetti.getIdAnnoDecisiones() != null &&
    // navigaProgetti.getIdAnnoDecisiones().size() > 0){
    //				if( navigaProgetti.getIdAnnoDecisiones().contains("-1") ){
    //					List<String> idAnnoAggregatos = new ArrayList<String>();
    //					idAnnoAggregatos.add("0");
    //					navigaAggregata.setIdAnnoAggregatos( idAnnoAggregatos );
    //				}else{
    //					List<String> idAnnoAggregatos = new ArrayList<String>();
    //					for( String tmp : navigaProgetti.getIdAnnoDecisiones() ){
    //
    //	idAnnoAggregatos.add((aggregataFacade.findAnniDecisione(Integer.valueOf(tmp))).getAnnoAggregato().getId().toString());
    //					}
    //					navigaAggregata.setIdAnnoAggregatos( idAnnoAggregatos );
    //				}
    //			}
    //			//FINE Gestione ANNI
    //
    //			listaAggregataDTO = aggregataFacade.findAggregataByNatura(navigaAggregata);
    //
    //			Double impoCostoProgettiProg = 0.0;
    //			Double impoImportoFinanziatoProg = 0.0;
    //
    //			for(AggregataDTO aggregataDTO : listaAggregataDTO){
    //				impoCostoProgettiProg = impoCostoProgettiProg + aggregataDTO.getImpoCostoProgetti();
    //				impoImportoFinanziatoProg = impoImportoFinanziatoProg +
    // aggregataDTO.getImpoImportoFinanziato();
    //			}
    //			model.addAttribute("costoDeiProgettiProg", impoCostoProgettiProg);
    //			model.addAttribute("importoFinanziamentiProg", impoImportoFinanziatoProg);
    //		}else{
    TotaliDTO totali = progettoFacade.sommaImpElencoProgetti(navigaProgetti);
    model.addAttribute("costoDeiProgettiProg", totali.getImpoCostoProgetto());
    model.addAttribute("importoFinanziamentiProg", totali.getImpoImportoFinanziato());
    model.addAttribute("volumeDeiProgettiProg", totali.getContaProgetti().intValue());
    //		}

    searchContainerElenco.setTotal(totali.getContaProgetti().intValue());

    model.addAttribute("searchContainerElenco", searchContainerElenco);

    /*
    System.out.println("STEP 4");

    Double impoCostoProgettiProg = 0.0;
    Double impoImportoFinanziatoProg = 0.0;

    for( Progetto p : elencoProgetti ){
    	impoCostoProgettiProg = impoCostoProgettiProg + p.getImpoCostoProgetto();
    	impoImportoFinanziatoProg = impoImportoFinanziatoProg + p.getImpoImportoFinanziato();
    }

    model.addAttribute("volumeDeiProgettiProg", size);
    model.addAttribute("costoDeiProgettiProg", impoCostoProgettiProg);
    model.addAttribute("importoFinanziamentiProg", impoImportoFinanziatoProg);
    */
    // FINE RIEPILOGO //

    model.addAttribute("valoreRicercaValido", "SI");

    return "elenco-progetti-view";
  }