AuditHelper.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.lib.audit.web;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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

import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.utils.date.DateUtils;
import org.openspcoop2.utils.regexp.RegularExpressionEngine;
import org.openspcoop2.web.lib.audit.costanti.Costanti;
import org.openspcoop2.web.lib.audit.dao.Filtro;
import org.openspcoop2.web.lib.audit.log.Binary;
import org.openspcoop2.web.lib.audit.log.Operation;
import org.openspcoop2.web.lib.audit.log.constants.Stato;
import org.openspcoop2.web.lib.audit.log.constants.Tipologia;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.DataElementType;
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;

/**
 * Utility per la gestione grafica delle servlet
 * 
 * 
 * @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 AuditHelper {
	HttpServletRequest request;
	PageData pd;
	HttpSession session;

	// Costruttore per le list
	public AuditHelper(HttpServletRequest request, PageData pd, HttpSession session) {
		this.request = request;
		this.pd = pd;
		this.session = session;
	}

	private static boolean useXml = false; // deprecato
	public static boolean isUseXml() {
		return useXml;
	}
	public static void setUseXml(boolean useXml) {
		AuditHelper.useXml = useXml;
	}

	public List<DataElement> addAuditingToDati(String statoaudit,
			String stato, String dump, String formatodump, String log4j,
			int numFiltri) throws Exception {
		try {
			List<DataElement> dati = new ArrayList<>();

			String[] tipi = {  AuditCostanti.DEFAULT_VALUE_ABILITATO, AuditCostanti.DEFAULT_VALUE_DISABILITATO };
			String[] tipiLabels = { AuditCostanti.DEFAULT_VALUE_ABILITATO, AuditCostanti.DEFAULT_VALUE_DISABILITATO };

			DataElement de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT);
			de.setType(DataElementType.TITLE);
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO_AUDIT);
			de.setType(DataElementType.SELECT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO_AUDIT);
			de.setValues(tipi);
			de.setLabels(tipiLabels);
			if (statoaudit != null)
				de.setSelected(statoaudit);
			//			de.setOnChange("CambiaStatoAudit()");
			de.setPostBack(true);
			dati.add(de);

			if (statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_AUDIT_COMPORTAMENTO_DI_DEFAULT);
				de.setType(DataElementType.TITLE);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO_2);
			if (statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.SELECT);
				de.setValues(tipi);
				de.setLabels(tipiLabels);
				if (stato != null)
					de.setSelected(stato);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(stato);
			}
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_DUMP);
			if (statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.SELECT);
				de.setValues(tipi);
				de.setLabels(tipiLabels);
				if (dump != null)
					de.setSelected(dump);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(dump);
			}
			de.setName(AuditCostanti.PARAMETRO_AUDIT_DUMP);
			dati.add(de);

			String[] tipiFormato =
				{ Costanti.DUMP_JSON_FORMAT, Costanti.DUMP_XML_FORMAT };
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_FORMATO_DUMP);
			if(!useXml) {
				formatodump = Costanti.DUMP_JSON_FORMAT;
			}
			if (useXml && statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.SELECT);
				de.setValues(tipiFormato);
				if (formatodump != null)
					de.setSelected(formatodump);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(formatodump);
			}
			de.setName(AuditCostanti.PARAMETRO_AUDIT_FORMATO_DUMP);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_LOG4J);
			if (statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.SELECT);
				de.setValues(tipi);
				de.setLabels(tipiLabels);
				if (log4j != null)
					de.setSelected(log4j);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(log4j);
			}
			de.setName(AuditCostanti.PARAMETRO_AUDIT_LOG4J);
			dati.add(de);

			if (statoaudit != null && statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_AUDIT_FILTRI);
				de.setType(DataElementType.TITLE);
				dati.add(de);

				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_AUDIT_VISUALIZZA);
				de.setType(DataElementType.LINK);
				de.setUrl(AuditCostanti.SERVLET_NAME_AUDIT_FILTRI_LIST);
				ServletUtils.setDataElementVisualizzaLabel(de,  (long)numFiltri);
				dati.add(de);
			}

			return dati;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public String auditCheckData(String statoaudit, String stato, String dump, String formatodump, String log4j)
			throws Exception {
		try {

			// Controllo che i campi "select" abbiano uno dei valori ammessi
			if (!statoaudit.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !statoaudit.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Stato dev'essere abilitato o disabilitato";
				return msg;
			}
			if (!stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !stato.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Audit dev'essere abilitato o disabilitato";
				return msg;
			}
			if (!dump.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !dump.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Dump dev'essere abilitato o disabilitato";
				return msg;
			}
			if (!formatodump.equals(Costanti.DUMP_JSON_FORMAT) &&
					!formatodump.equals(Costanti.DUMP_XML_FORMAT)) {
				String msg = "Formato dump dev'essere "+Costanti.DUMP_JSON_FORMAT+
						" o "+Costanti.DUMP_XML_FORMAT;
				return msg;
			}
			if (!log4j.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !log4j.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Log4j Auditing dev'essere abilitato o disabilitato";
				return msg;
			}

			return "";
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	// Prepara la lista di filtri
	public void prepareFiltriList(ISearch ricerca, List<Filtro> lista,
			int idLista) throws Exception {
		try {

			ServletUtils.addListElementIntoSession(this.request, this.session, AuditCostanti.OBJECT_NAME_CONFIGURAZIONE_AUDITING_FILTRI);

			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = ServletUtils.getSearchFromSession(ricerca, idLista);

			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));

			// setto la barra del titolo
			List<Parameter> lstParam = new ArrayList<>();

			lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT, 
					AuditCostanti.SERVLET_NAME_AUDIT));
			if(search.equals("")){
				this.pd.setSearchDescription("");
				lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT_FILTRI, 
						null));
			}else{
				lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT_FILTRI, 
						AuditCostanti.SERVLET_NAME_AUDIT_FILTRI_LIST));
				lstParam.add(new Parameter(org.openspcoop2.web.lib.mvc.Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
			}
			ServletUtils.setPageDataTitle(this.pd, lstParam);

			// controllo eventuali risultati ricerca
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, AuditCostanti.LABEL_AUDIT_FILTRI, search);
			}

			// setto le label delle colonne
			String[] labels = { 
					AuditCostanti.LABEL_AUDIT_DESCRIZIONE,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_DUMP
			};
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			if (lista != null) {
				Iterator<Filtro> it = lista.iterator();
				while (it.hasNext()) {
					Filtro f = it.next();

					List<DataElement> e = new ArrayList<DataElement>();

					DataElement de = new DataElement();
					de.setUrl(
							AuditCostanti.SERVLET_NAME_AUDIT_FILTRI_CHANGE,
							new Parameter(AuditCostanti.PARAMETRO_AUDIT_ID, f.getId() + "")
							);
					de.setValue(f.toString());
					de.setIdToRemove(""+f.getId());
					e.add(de);

					de = new DataElement();
					de.setValue(f.isAuditEnabled() ? AuditCostanti.DEFAULT_VALUE_ABILITATO : AuditCostanti.DEFAULT_VALUE_DISABILITATO);
					e.add(de);

					de = new DataElement();
					de.setValue(f.isDumpEnabled() ? AuditCostanti.DEFAULT_VALUE_ABILITATO : AuditCostanti.DEFAULT_VALUE_DISABILITATO);
					e.add(de);

					dati.add(e);
				}
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(true);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public List<DataElement> addFiltroToDati(Tipologia tipoOp, String utente,
			String tipooperazione, String[] tipiOgg, String tipooggetto,
			String statooperazione, String stato,
			String tipofiltro, String dump, String statoazione,
			String dumpazione, String id) throws Exception {
		try {
			List<DataElement> dati = new ArrayList<>();

			String[] tipi = { AuditCostanti.DEFAULT_VALUE_ABILITATO, AuditCostanti.DEFAULT_VALUE_DISABILITATO };
			String[] tipiLabels = { AuditCostanti.DEFAULT_VALUE_ABILITATO, AuditCostanti.DEFAULT_VALUE_DISABILITATO };

			DataElement de = null;


			if (tipoOp.equals(Tipologia.CHANGE)) {
				de = new DataElement();
				de.setValue(id);
				de.setType(DataElementType.HIDDEN);
				de.setName(AuditCostanti.PARAMETRO_AUDIT_ID);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_FILTRO_GENERICO);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_UTENTE);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_UTENTE);
			de.setType(DataElementType.TEXT_EDIT);
			de.setValue(utente);
			dati.add(de);

			String[] tipiOp =
				{ "-", Tipologia.ADD.toString(),
					Tipologia.CHANGE.toString(),
					Tipologia.DEL.toString() };
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO_OPERAZIONE);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_TIPO_OPERAZIONE);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiOp);
			if (tipooperazione != null)
				de.setSelected(tipooperazione);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO_OGGETTO);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_TIPO_OGGETTO);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiOgg);
			if (tipooggetto != null)
				de.setSelected(tipooggetto);
			dati.add(de);

			String[] tipiStatoOp =
				{ "-", Stato.REQUESTING.toString(),
					Stato.ERROR.toString(),
					Stato.COMPLETED.toString() };
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO_OPERAZIONE);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO_OPERAZIONE);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiStatoOp);
			if (statooperazione != null)
				de.setSelected(statooperazione);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_FILTRO_CONTENUTO);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO);
			de.setType(DataElementType.SELECT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO);
			de.setValues(tipi);
			de.setLabels(tipiLabels);
			if (stato != null)
				de.setSelected(stato);
			//			de.setOnChange("CambiaStatoFiltro('" + tipoOp + "')");
			de.setPostBack(true);
			dati.add(de);

			String[] tipiFiltro =
				{	AuditCostanti.DEFAULT_VALUE_PARAMETRO_AUDIT_TIPO_FILTRO_NORMALE,
					AuditCostanti.DEFAULT_VALUE_PARAMETRO_AUDIT_TIPO_FILTRO_ESPRESSIONE_REGOLARE
				};
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO);

			de.setName(AuditCostanti.PARAMETRO_AUDIT_TIPO_FILTRO);
			if (stato != null && stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.SELECT);
				de.setValues(tipiFiltro);
				if (tipofiltro != null)
					de.setSelected(tipofiltro);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(tipofiltro);
			}
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_DUMP);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_DUMP);
			if (stato != null && stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO)) {
				de.setType(DataElementType.TEXT_EDIT);
				de.setValue(dump);
				de.setRequired(true);
			} else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(dump);
			}
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_AZIONE);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO);
			de.setType(DataElementType.SELECT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO_AZIONE);
			de.setValues(tipi);
			de.setLabels(tipiLabels);
			if (statoazione != null)
				de.setSelected(statoazione);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_DUMP);
			de.setType(DataElementType.SELECT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_DUMP_AZIONE);
			de.setValues(tipi);
			de.setLabels(tipiLabels);
			if (dumpazione != null)
				de.setSelected(dumpazione);
			dati.add(de);

			return dati;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public String filtriCheckData(String utente, String tipooperazione,
			String tipooggetto, String statooperazione,
			String stato, String tipofiltro,
			String dump, String statoazione,
			String dumpazione, String[] tipiOgg)
			throws Exception {
		try {

			// Controllo che i campi "select" abbiano uno dei valori ammessi
			if (!tipooperazione.equals("-") &&
					!tipooperazione.equals(Tipologia.ADD.toString()) &&
					!tipooperazione.equals(Tipologia.CHANGE.toString()) &&
					!tipooperazione.equals(Tipologia.DEL.toString())) {
				String msg = "Tipo operazione dev'essere - o "+
						Tipologia.ADD.toString()+
						" o "+Tipologia.CHANGE.toString()+
						" o "+Tipologia.DEL.toString();
				return msg;
			}
			if (!statooperazione.equals("-") &&
					!statooperazione.equals(Stato.REQUESTING.toString()) &&
					!statooperazione.equals(Stato.ERROR.toString()) &&
					!statooperazione.equals(Stato.COMPLETED.toString())) {
				String msg = "Stato operazione dev'essere - o "+
						Stato.REQUESTING.toString()+
						" o "+Stato.ERROR.toString()+
						" o "+Stato.COMPLETED.toString();
				return msg;
			}
			if (!stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !stato.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Stato dev'essere abilitato o disabilitato";
				return msg;
			}
			if (stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) &&
					!tipofiltro.equals("normale") && !tipofiltro.equals("espressioneRegolare")) {
				String msg = "Tipo dev'essere normale o espressioneRegolare";
				return msg;
			}
			if (!statoazione.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !statoazione.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Stato dev'essere abilitato o disabilitato";
				return msg;
			}
			if (!dumpazione.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && !dumpazione.equals(AuditCostanti.DEFAULT_VALUE_DISABILITATO)) {
				String msg = "Dump dev'essere abilitato o disabilitato";
				return msg;
			}

			// Controllo che il tipo oggetto appartenga alla lista di
			// tipi oggetto disponibili
			String allOgg = "";
			boolean trovatoOgg = false;
			for (int i = 0; i < tipiOgg.length; i++) {
				String tmpOgg = tipiOgg[i];
				if (tmpOgg.equals(tipooggetto)) {
					trovatoOgg = true;
				}
				if (allOgg.equals(""))
					allOgg = tmpOgg;
				else
					allOgg = allOgg+", "+tmpOgg;
			}
			if (!trovatoOgg) {
				String msg = "Il tipo oggetto dev'essere scelto tra: "+allOgg;
				return msg;
			}

			// Se lo stato è abilitato, dump dev'essere specificato
			if (stato.equals(AuditCostanti.DEFAULT_VALUE_ABILITATO) && dump.equals("")) {
				String msg = "Se Stato è abilitato, Dump dev'essere valorizzato";
				return msg;
			}

			// Errore se non è stato impostato nessuno tra l'username,
			// il tipo di operazione, il tipo di oggetto, lo stato operazione
			// e il filtro per contenuto abilitato
			if (utente.equals("") && tipooperazione.equals("-") &&
					tipooggetto.equals("-") && statooperazione.equals("-") &&
					!AuditCostanti.DEFAULT_VALUE_ABILITATO.equals(stato)) {
				String msg = "Specificare almeno un criterio di filtro generico o un filtro per contenuto";
				return msg;
			}

			return "";
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public List<DataElement> addAuditReportToDati(String datainizio,
			String datafine, String tipooperazione, String[] tipiOgg,
			String tipooggetto, String id, String oldid,
			String utente, String statooperazione, String contoggetto)
					throws Exception {
		try {
			List<DataElement> dati = new ArrayList<DataElement>();

			DataElement de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_CRITERI_RICERCA);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			int valueSize = 40;

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_DATA_INIZIO_LABEL);
			de.setNote(AuditCostanti.LABEL_PARAMETRO_AUDIT_DATA_INIZIO_NOTE);
			de.setValue(datainizio != null ? datainizio : "");
			de.setType(DataElementType.TEXT_EDIT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_DATA_INIZIO);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_DATA_FINE_LABEL);
			de.setNote(AuditCostanti.LABEL_PARAMETRO_AUDIT_DATA_FINE_NOTE);
			de.setValue(datafine != null ? datafine : "");
			de.setType(DataElementType.TEXT_EDIT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_DATA_FINE);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_UTENTE);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_UTENTE);
			de.setType(DataElementType.TEXT_EDIT);
			de.setValue(utente);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_OPERAZIONE);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			String[] tipiOp =
				{ "-", Tipologia.ADD.toString(),
					Tipologia.CHANGE.toString(),
					Tipologia.DEL.toString(),
					Tipologia.LOGIN.toString(),
					Tipologia.LOGOUT.toString() };
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_TIPO_OPERAZIONE);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiOp);
			if (tipooperazione != null)
				de.setSelected(tipooperazione);
			de.setSize(valueSize);
			dati.add(de);

			String[] tipiStatoOp =
				{ "-", Stato.REQUESTING.toString(),
					Stato.ERROR.toString(),
					Stato.COMPLETED.toString() };
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO_OPERAZIONE);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiStatoOp);
			if (statooperazione != null)
				de.setSelected(statooperazione);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_OGGETTO);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_TIPO_OGGETTO);
			de.setType(DataElementType.SELECT);
			de.setValues(tipiOgg);
			if (tipooggetto != null)
				de.setSelected(tipooggetto);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_ID);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_ID);
			de.setType(DataElementType.TEXT_EDIT);
			de.setValue(id);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_OPERATION_OLD_ID);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OLD_ID);
			de.setType(DataElementType.TEXT_EDIT);
			de.setValue(oldid);
			de.setSize(valueSize);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_CONTENUTO_OGGETTO);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_CONTENUTO_OGGETTO);
			de.setType(DataElementType.TEXT_EDIT);
			de.setValue(contoggetto);
			de.setSize(valueSize);
			dati.add(de);

			return dati;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public String auditReportCheckData(String datainizio, String datafine,
			String tipooperazione, String tipooggetto,
			String id, String oldid,
			String statooperazione,
			String[] tipiOgg)
			throws Exception {
		try {

			// Controllo che i campi "select" abbiano uno dei valori ammessi
			if (!tipooperazione.equals("-") &&
					!tipooperazione.equals(Tipologia.ADD.toString()) &&
					!tipooperazione.equals(Tipologia.CHANGE.toString()) &&
					!tipooperazione.equals(Tipologia.DEL.toString()) &&
					!tipooperazione.equals(Tipologia.LOGIN.toString()) &&
					!tipooperazione.equals(Tipologia.LOGOUT.toString())) {
				String msg = "Tipo operazione dev'essere - o "+
						Tipologia.ADD.toString()+
						" o "+Tipologia.CHANGE.toString()+
						" o "+Tipologia.DEL.toString()+
						" o "+Tipologia.LOGIN.toString()+
						" o "+Tipologia.LOGOUT.toString();
				return msg;
			}
			if (!statooperazione.equals("-") &&
					!statooperazione.equals(Stato.REQUESTING.toString()) &&
					!statooperazione.equals(Stato.ERROR.toString()) &&
					!statooperazione.equals(Stato.COMPLETED.toString())) {
				String msg = "Stato operazione dev'essere - o "+
						Stato.REQUESTING.toString()+
						" o "+Stato.ERROR.toString()+
						" o "+Stato.COMPLETED.toString();
				return msg;
			}

			// Controllo che il tipo oggetto appartenga alla lista di
			// tipi oggetto disponibili
			String allOgg = "";
			boolean trovatoOgg = false;
			for (int i = 0; i < tipiOgg.length; i++) {
				String tmpOgg = tipiOgg[i];
				if (tmpOgg.equals(tipooggetto)) {
					trovatoOgg = true;
				}
				if (allOgg.equals(""))
					allOgg = tmpOgg;
				else
					allOgg = allOgg+", "+tmpOgg;
			}
			if (!trovatoOgg) {
				String msg = "Il tipo oggetto dev'essere scelto tra: "+allOgg;
				return msg;
			}

			if ( (datainizio == null || "".equals(datainizio)) 
					&&
					(id == null || "".equals(id)) 
					&&
					(oldid == null || "".equals(oldid)) ) {
				String msg = "Deve essere indicato almeno uno dei seguenti criteri di ricerca: Intervallo Iniziale, Identificativo, Id precedente alla modifica";
				return msg;
			}
			
			// Controlli sulle date
			if (datainizio != null && !"".equals(datainizio)) {
				boolean dataInOk = true;
				if (datainizio.length() != 10) {
					dataInOk = false;
				} else {
					String anno = datainizio.substring(0, 4);
					String mese = datainizio.substring(5, 7);
					String giorno = datainizio.substring(8, 10);
					if (!RegularExpressionEngine.isMatch(anno,"^[0-9]+$")) {
						dataInOk = false;
					} else if (!datainizio.substring(4, 5).equals("-")) {
						dataInOk = false;
					} else if (!RegularExpressionEngine.isMatch(mese,"^[0-9]+$")) {
						dataInOk = false;
					} else if (!datainizio.substring(7, 8).equals("-")) {
						dataInOk = false;
					} else if (!RegularExpressionEngine.isMatch(giorno,"^[0-9]+$")) {
						dataInOk = false;
					} else {
						int annoI = Integer.parseInt(anno);
						int meseI = Integer.parseInt(mese);
						int giornoI = Integer.parseInt(giorno);
						if ((meseI == 1) || (meseI == 3) || (meseI == 5) || (meseI == 7) || (meseI == 8) || (meseI == 10) || (meseI == 12)) {
							if ((giornoI == 0) || (giornoI > 31)) {
								dataInOk = false;
							}
						} else {
							if ((meseI == 4) || (meseI == 6) || (meseI == 9) || (meseI == 11)) {
								if ((giornoI == 0) || (giornoI > 30)) {
									dataInOk = false;
								}
							} else {
								if (meseI == 2) {
									int bisestile = annoI / 4;
									if (annoI != bisestile * 4) {
										if ((giornoI == 0) || (giornoI > 28)) {
											dataInOk = false;
										}
									} else if ((giornoI == 0) || (giornoI > 29)) {
										dataInOk = false;
									}
								} else {
									dataInOk = false;
								}
							}
						}
					}
				}
				if (!dataInOk) {
					String msg = "Inizio intervallo espresso in una forma sbagliata. Esprimerlo come yyyy-MM-dd";
					return msg;
				}
			}

			if (datafine != null && !"".equals(datafine)) {
				boolean dataFineOk = true;
				if (datafine.length() != 10) {
					dataFineOk = false;
				} else {
					String anno = datafine.substring(0, 4);
					String mese = datafine.substring(5, 7);
					String giorno = datafine.substring(8, 10);
					if (!RegularExpressionEngine.isMatch(anno,"^[0-9]+$")) {
						dataFineOk = false;
					} else if (!datafine.substring(4, 5).equals("-")) {
						dataFineOk = false;
					} else if (!RegularExpressionEngine.isMatch(mese,"^[0-9]+$")) {
						dataFineOk = false;
					} else if (!datafine.substring(7, 8).equals("-")) {
						dataFineOk = false;
					} else if (!RegularExpressionEngine.isMatch(giorno,"^[0-9]+$")) {
						dataFineOk = false;
					} else {
						int annoI = Integer.parseInt(anno);
						int meseI = Integer.parseInt(mese);
						int giornoI = Integer.parseInt(giorno);
						if ((meseI == 1) || (meseI == 3) || (meseI == 5) || (meseI == 7) || (meseI == 8) || (meseI == 10) || (meseI == 12)) {
							if ((giornoI == 0) || (giornoI > 31)) {
								dataFineOk = false;
							}
						} else {
							if ((meseI == 4) || (meseI == 6) || (meseI == 9) || (meseI == 11)) {
								if ((giornoI == 0) || (giornoI > 30)) {
									dataFineOk = false;
								}
							} else {
								if (meseI == 2) {
									int bisestile = annoI / 4;
									if (annoI != bisestile * 4) {
										if ((giornoI == 0) || (giornoI > 28)) {
											dataFineOk = false;
										}
									} else if ((giornoI == 0) || (giornoI > 29)) {
										dataFineOk = false;
									}
								} else {
									dataFineOk = false;
								}
							}
						}
					}
				}
				if (!dataFineOk) {
					String msg = "Fine intervallo espresso in una forma sbagliata. Esprimerlo come yyyy-MM-dd";
					return msg;
				}
			}

			return "";
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	// Prepara la lista di operazioni
	public void prepareAuditReportList(ISearch ricerca, List<Operation> lista,
			int idLista,
			String datainizio, String datafine,
			String tipooperazione, String tipooggetto,
			String id, String oldid,
			String utente, String statooperazione,
			String contoggetto) throws Exception {
		try {

			ServletUtils.addListElementIntoSession(this.request, this.session, AuditCostanti.OBJECT_NAME_AUDITING);

			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			//String search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));

			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));

			Parameter pDataInizio = new Parameter(AuditCostanti.PARAMETRO_AUDIT_DATA_INIZIO, datainizio);
			Parameter pDataFine = new Parameter(AuditCostanti.PARAMETRO_AUDIT_DATA_FINE, datafine);
			Parameter pTipoOperazione = new Parameter(AuditCostanti.PARAMETRO_AUDIT_TIPO_OPERAZIONE, tipooperazione);
			Parameter pTipoOggetto = new Parameter(AuditCostanti.PARAMETRO_AUDIT_TIPO_OGGETTO, tipooggetto);
			Parameter pId = new Parameter(AuditCostanti.PARAMETRO_AUDIT_ID, id);
			Parameter pOldId = new Parameter(AuditCostanti.PARAMETRO_AUDIT_OLD_ID, oldid);
			Parameter pUtente = new Parameter(AuditCostanti.PARAMETRO_AUDIT_UTENTE, utente);
			Parameter pStatoOperazione = new Parameter(AuditCostanti.PARAMETRO_AUDIT_STATO_OPERAZIONE, statooperazione);
			Parameter pContoggetto = new Parameter(AuditCostanti.PARAMETRO_AUDIT_CONTENUTO_OGGETTO, contoggetto);
			Parameter pEditModeFin = ServletUtils.getParameterForEditModeFinished();

			String params = ServletUtils.getParametersAsString(false, pDataInizio, pDataFine, pTipoOperazione, pTipoOggetto, pId, pOldId, pUtente, pStatoOperazione, pContoggetto, pEditModeFin);

			// setto la barra del titolo
			List<GeneralLink> titlelist = new ArrayList<>();
			GeneralLink tl1 = new GeneralLink();
			tl1.setLabel(AuditCostanti.LABEL_AUDIT);
			tl1.setUrl(AuditCostanti.SERVLET_NAME_AUDITING);
			titlelist.add(tl1);
			GeneralLink tl2 = new GeneralLink();
			tl2.setLabel(AuditCostanti.LABEL_AUDIT_OPERAZIONI);
			titlelist.add(tl2);
			this.pd.setTitleList(titlelist);

			this.pd.setSearch("off");

			// setto le label delle colonne
			String[] labels = {
					AuditCostanti.LABEL_PARAMETRO_AUDIT_DATA_ESECUZIONE,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_OPERAZIONE,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_OGGETTO,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_ID_UPPER_CASE,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_UTENTE,
			};
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			if (lista != null) {
				Iterator<Operation> it = lista.iterator();
				while (it.hasNext()) {
					Operation op = it.next();

					List<DataElement> e = new ArrayList<>();

					DataElement de = new DataElement();
					de.setUrl(
							AuditCostanti.SERVLET_NAME_AUDITING_DETTAGLIO,
							new Parameter(AuditCostanti.PARAMETRO_AUDIT_OPERATION_ID_OP, op.getId() + ""),
							pDataInizio, pDataFine, pTipoOperazione, pTipoOggetto, pId, pOldId, pUtente, pStatoOperazione, pContoggetto

							);
					de.setValue(DateUtils.getSimpleDateFormatMs().format(op.getTimeExecute())); //+ " ["+op.getId()+"]");
					de.setIdToRemove(""+op.getId());
					e.add(de);

					de = new DataElement();
					de.setValue(op.getTipologia().getValue());
					e.add(de);

					de = new DataElement();
					de.setValue(op.getStato().getValue());
					e.add(de);

					de = new DataElement();
					de.setValue(op.getTipoOggetto());
					e.add(de);

					de = new DataElement();
					if(op.getObjectId()!=null && op.getObjectId().length()>60){
						de.setValue(op.getObjectId().substring(0, 60)+" ...");
						de.setToolTip(op.getObjectId());
					}else{
						de.setValue(op.getObjectId());
					}
					e.add(de);

					de = new DataElement();
					de.setValue(op.getUtente());
					e.add(de);

					dati.add(e);
				}
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(false);

			this.request.setAttribute(org.openspcoop2.web.lib.mvc.Costanti.REQUEST_ATTIBUTE_PARAMS, params);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public List<DataElement> addAuditReportDettaglioToDati(Operation op, boolean showLinkDocumentiBinari,
			Parameter ... params) throws Exception {
		try {
			List<DataElement> dati = new ArrayList<>();
			Parameter pIdOp = new Parameter(AuditCostanti.PARAMETRO_AUDIT_OPERATION_ID_OP, op.getId() + "");
			Parameter pTypeOggetto = new Parameter(AuditCostanti.PARAMETRO_AUDIT_TYPE, AuditCostanti.DEFAULT_VALUE_PARAMETRO_AUDIT_TYPE_OGGETTO);
			Parameter pTypeErrore = new Parameter(AuditCostanti.PARAMETRO_AUDIT_TYPE, AuditCostanti.DEFAULT_VALUE_PARAMETRO_AUDIT_TYPE_ERROR);

			DataElement de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_DETTAGLIO_OPERAZIONE);
			de.setType(DataElementType.TITLE);
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_OPERATION_TIME_REQUEST);
			de.setValue(""+op.getTimeRequest());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_TIME_REQUEST);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_OPERATION_TIME_EXECUTE);
			de.setValue(""+op.getTimeExecute());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_TIME_EXECUTE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_ID_OPERAZIONE);
			de.setValue(""+op.getId());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_ID_OPERAZIONE);
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO_OPERAZIONE);
			de.setValue(op.getTipologia().getValue());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_TIPO_OPERAZIONE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_TIPO_OGGETTO);
			de.setValue(op.getTipoOggetto());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_TIPO_OGGETTO);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_ID);
			de.setValue(op.getObjectId());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_OBJECT_ID);
			dati.add(de);

			if (op.getObjectOldId() != null) {
				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_OPERATION_OLD_ID);
				de.setValue(op.getObjectOldId());
				de.setType(DataElementType.TEXT);
				de.setName(AuditCostanti.PARAMETRO_AUDIT_OPERATION_OBJECT_OLD_ID  );
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_UTENTE);
			de.setValue(op.getUtente());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_UTENTE);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_PARAMETRO_AUDIT_STATO);
			de.setValue(op.getStato().getValue());
			de.setType(DataElementType.TEXT);
			de.setName(AuditCostanti.PARAMETRO_AUDIT_STATO);
			dati.add(de);

			int size2 = params != null ? params.length +2 : 2;
			Parameter [] paramsErr = new Parameter[size2];
			Parameter [] paramsOgg = new Parameter[size2];
			paramsErr[0] = pIdOp;
			paramsErr[1] = pTypeErrore;
			paramsOgg[0] = pIdOp;
			paramsOgg[1] = pTypeOggetto;
			

			if(params != null){
			for (int i=0; i < params.length ; i++ ){
				paramsErr[i+2] = params[i];
				paramsOgg[i+2] = params[i];
			}
			}
			
			if (Stato.ERROR.equals(op.getStato())) {
				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_AUDIT_MOTIVO_ERRORE);
				de.setUrl(
						AuditCostanti.SERVLET_NAME_AUDITING_DETTAGLIO_INFO, paramsErr);
				de.setValue(AuditCostanti.LABEL_AUDIT_MOTIVO_ERRORE);
				de.setType(DataElementType.LINK);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_DETTAGLIO_OGGETTO);
			if(op.getObjectDetails()!=null && !"".equals(op.getObjectDetails())){
				de.setUrl(
						AuditCostanti.SERVLET_NAME_AUDITING_DETTAGLIO_INFO, paramsOgg);
				de.setType(DataElementType.LINK);
			}
			else{
				de.setType(DataElementType.HIDDEN);
			}
			de.setValue(AuditCostanti.LABEL_AUDIT_DETTAGLIO_OGGETTO);
			dati.add(de);

			int size = params != null ? params.length +1 : 1;
			Parameter [] params2 = new Parameter[size];
			params2[0] = pIdOp;

			if(params != null){
			for (int i=0; i < params.length ; i++ ){
				params2[i+1] = params[i];
			}
			}
			
			if(showLinkDocumentiBinari) {
				de = new DataElement();
				de.setLabel(AuditCostanti.LABEL_AUDIT_DOCUMENTI_BINARI);
				de.setUrl(AuditCostanti.SERVLET_NAME_AUDITING_DETTAGLIO_DOCUMENTI_BINARI, params2);
				de.setValue(AuditCostanti.LABEL_AUDIT_DOCUMENTI_BINARI + " ("+op.sizeBinaryList()+")");
				de.setType(DataElementType.LINK);
				dati.add(de);
			}

			return dati;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	public List<DataElement> addAuditReportInfoToDati(String type,
			String info) throws Exception {
		try {
			List<DataElement> dati = new ArrayList<>();

			DataElement de = new DataElement();
			de.setLabel(AuditCostanti.LABEL_AUDIT_DETTAGLIO_OGGETTO);
			de.setType(DataElementType.TITLE);
			dati.add(de);
			
			de = new DataElement();
			if (type.equals(AuditCostanti.DEFAULT_VALUE_PARAMETRO_AUDIT_TYPE_ERROR))
				de.setLabel(AuditCostanti.LABEL_AUDIT_MOTIVO_ERRORE);
//			else
//				de.setLabel(AuditCostanti.LABEL_AUDIT_DETTAGLIO_OGGETTO);
			de.setType(DataElementType.TEXT_AREA_NO_EDIT);
			de.setValue(info);
			de.setRows(30);
			de.setCols(80);
			dati.add(de);

			return dati;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}

	// Prepara la lista di documenti binari
	public void prepareDocBinList(Operation singleOp, Parameter ... params)
			throws Exception {
		try {
			this.pd.setNumEntries(singleOp.sizeBinaryList());

			Parameter pIdOp = new Parameter(AuditCostanti.PARAMETRO_AUDIT_OPERATION_ID_OP, singleOp.getId() + "");
			// setto la barra del titolo
			List<Parameter> lstParam = new ArrayList<>();

			int size = params != null ? params.length +1 : 1;
			Parameter [] params2 = new Parameter[size];
			params2[0] = pIdOp;

			if(params != null){
			for (int i=0; i < params.length ; i++ ){
				params2[i+1] = params[i];
			}
			}

			lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT, AuditCostanti.SERVLET_NAME_AUDITING));
			lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT_OPERAZIONI, AuditCostanti.SERVLET_NAME_AUDITING, params));
			lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT_DETTAGLIO +" di " + singleOp.getId(), 
					AuditCostanti.SERVLET_NAME_AUDITING_DETTAGLIO, params2)); 
			lstParam.add(new Parameter(AuditCostanti.LABEL_AUDIT_DOCUMENTI_BINARI, null));

			ServletUtils.setPageDataTitle(this.pd, lstParam);

			this.pd.setSearch("off");

			// setto le label delle colonne
			String[] labels = { 
					AuditCostanti.LABEL_PARAMETRO_AUDIT_ID_UPPER_CASE,
					AuditCostanti.LABEL_PARAMETRO_AUDIT_CHECKSUM
			};
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			for (int i=0; i<singleOp.sizeBinaryList(); i++) {
				Binary bin = singleOp.getBinary(i);

				List<DataElement> e = new ArrayList<>();

				DataElement de = new DataElement();
				de.setValue(bin.getBinaryId());
				e.add(de);

				de = new DataElement();
				de.setValue(""+bin.getChecksum());
				e.add(de);

				dati.add(e);
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(false);
			this.pd.setSelect(false);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}
}