OperazioniHelper.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.web.ctrlstat.servlet.operazioni;

import java.text.SimpleDateFormat;
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.utils.date.DateUtils;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.servlet.ConsoleHelper;
import org.openspcoop2.web.ctrlstat.servlet.monitor.MonitorCostanti;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.DataElementType;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.Parameter;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.queue.costanti.OperationStatus;
import org.openspcoop2.web.lib.queue.dao.Operation;
import org.openspcoop2.web.lib.users.dao.PermessiUtente;
import org.openspcoop2.web.lib.users.dao.User;


/****
 * 
 * OperazioniHelper
 *
 * @author Pintori Giuliano (pintori@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class OperazioniHelper extends ConsoleHelper{

	private SimpleDateFormat formatter = DateUtils.getSimpleDateFormatSecond();

	public OperazioniHelper(HttpServletRequest request, PageData pd, 
			HttpSession session) throws Exception {
		super(request, pd,  session);
	}
	public OperazioniHelper(ControlStationCore core, HttpServletRequest request, PageData pd, 
			HttpSession session) throws Exception {
		super(core, request, pd,  session);
	}

	public void prepareOperazioniList(ConsoleSearch ricerca, List<Operation> lista)throws Exception {
		try {

			ArrayList<String> errors = new ArrayList<>();
			OperazioniFormBean formBean = this.getBeanForm(errors);

			Parameter pUtente = new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE, formBean.getUtente());
			Parameter pOperazione = new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE, formBean.getTipo());
			Parameter pDetail = new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_METHOD, OperazioniCostanti.DEFAULT_VALUE_FORM_BEAN_METHOD_DETAILS);

			ServletUtils.addListElementIntoSession(this.request, this.session, OperazioniCostanti.OBJECT_NAME_OPERAZIONI, pOperazione, pUtente);

			int idLista =  this.operazioniCore.getIdLista(formBean); 
			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<>();

			String elencoLabel = OperazioniCostanti.getTipoOperazioneLabelFromValue(formBean.getTipo());

			lstParam.add(new Parameter(OperazioniCostanti.LABEL_OPERAZIONI, OperazioniCostanti.SERVLET_NAME_OPERAZIONI, pUtente, pOperazione));
			if(search.equals("")){
				this.pd.setSearchDescription("");
				lstParam.add(new Parameter(elencoLabel,null));
			}
			else{
				lstParam.add(new Parameter(elencoLabel, OperazioniCostanti.SERVLET_NAME_OPERAZIONI, pUtente, pOperazione));
			}

			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParam.toArray(new Parameter[lstParam.size()]));

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

			// Genero l'elenco delle labels
			List<String> listaLabel = getListaLabel(formBean);  


			String[] labels = listaLabel.toArray(new String[listaLabel.size()]);
			this.pd.setLabels(labels);

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

			// Risultati Ricerca

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

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

					Parameter pId = new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_ID, op.getId()+"");

					// Colonna Id
					DataElement	de = new DataElement();
					de.setUrl(OperazioniCostanti.SERVLET_NAME_OPERAZIONI, pId, pOperazione ,pUtente,pDetail);
					de.setValue(op.getId()+"");
					de.setIdToRemove(op.getId().toString());
					e.add(de);

					// Colonna Operazione

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

					// Colonna Host

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

					// Colonna Utente
					User user = ServletUtils.getUserFromSession(this.request, this.session);
					if(user.getPermessi().isUtenti()){
						de = new DataElement();
						de.setValue(op.getSuperUser());
						e.add(de);
					}
					
					// Colonna Data Richiesta

					de = new DataElement();
					de.setValue(this.formatter.format(op.getTimeReq().getTime()));
					e.add(de);

					// Colonna Data Esecuzione

					if(!formBean.getTipo().equals(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_IN_CODA)){
						de = new DataElement();
						de.setValue(this.formatter.format(op.getTimeExecute().getTime()));
						e.add(de);	
					}

					// Colonna Eliminata
					if(formBean.getTipo().equals(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_ESEGUITE)){
						de = new DataElement();
						if (op.isDeleted())
							de.setValue(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_ELIMINAZIONE_OPERATORE);
						else
							de.setValue("");
						e.add(de);
					}

					dati.add(e);
				}
			}

			this.pd.setDati(dati);

			this.pd.setAddButton(false);

			if(formBean.getTipo().equals(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_ESEGUITE)){
				this.pd.setRemoveButton(false);
				this.pd.setSelect(false);
			}
		} catch (Exception e) {
			this.log.error("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}


	}

	private List<String> getListaLabel(OperazioniFormBean formBean) {
		List<String> listaLabel = new ArrayList<>();

		User user = ServletUtils.getUserFromSession(this.request, this.session);
		
		String operazione = formBean.getTipo();
		// Label comuni
		listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_ID);
		listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_OPERAZIONE);
		listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_HOST);
		if(user.getPermessi().isUtenti()){
			listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_UTENTE);
		}
		listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_DATA_RICHIESTA);

		// tutte tranne quelle in coda hanno la colonna data esecuzione
		if(!operazione.equals(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_IN_CODA))
			listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_DATA_ESECUZIONE);

		// quelle eseguite hanno anche la colonne eliminate
		if(operazione.equals(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_ESEGUITE))
			listaLabel.add(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_ELIMINATA);

		return listaLabel;
	}


	public void showForm(String azione, String soglia, OperazioniFormBean formBean ) throws Exception {
		try {
			User user = ServletUtils.getUserFromSession(this.request, this.session);
			PermessiUtente permessi = user.getPermessi();
			boolean hasPermessiUtenti = permessi.isUtenti();

			// setto la barra del titolo
			ServletUtils.setPageDataTitle_ServletFirst(this.pd, OperazioniCostanti.LABEL_OPERAZIONI, OperazioniCostanti.SERVLET_NAME_OPERAZIONI);

			// preparo i campi
			List<DataElement> dati = new ArrayList<>();
			dati.add(ServletUtils.getDataElementForEditModeFinished());


			// Campi Ricerca

			// Tipo Operazione
			String[] tipoOperazioneValori = OperazioniCostanti.getParametroOperazioniOperazioneList();
			String[] tipoOperazioneLabel = OperazioniCostanti.getLabelParametroOperazioniOperazioneList();

			DataElement de = new DataElement();
			de.setLabel(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_OPERAZIONE);
			de.setValues(tipoOperazioneValori);
			de.setLabels(tipoOperazioneLabel);
			de.setSelected(formBean.getTipo());
			de.setType(DataElementType.SELECT);
			de.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE);
			if(!hasPermessiUtenti)
				de.setSize(this.getSize());
			dati.add(de);



			// Utente

			de = new DataElement();

			if(hasPermessiUtenti){
				// Titolo Filter
				de.setLabel(MonitorCostanti.LABEL_MONITOR_FILTRO_RICERCA);
				de.setType(DataElementType.TITLE);
				dati.add(de);

				de = new DataElement();
				de.setType(DataElementType.SELECT);
				List<User> listaUser =	formBean.getListaUser();
				List<String> utentiLabels = new ArrayList<>();
				List<String> utentiValues = new ArrayList<>();

				if(listaUser != null && !listaUser.isEmpty()){
					for (User ut : listaUser) {
						utentiLabels.add(ut.getLogin());
						utentiValues.add(ut.getLogin());
					}
				}

				utentiLabels.add(0, OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_UTENTE_ALL);
				utentiValues.add(0, OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE_ALL);

				de.setLabels(utentiLabels);
				de.setValues(utentiValues);
				de.setSelected(formBean.getUtente());
			}else {
				de.setValue(formBean.getUtente());
				de.setType(DataElementType.HIDDEN);
			}
			de.setLabel(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_UTENTE);
			de.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE);
			dati.add(de);

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

	/**
	 * Recupera i dati dalla request e riempe il form
	 * 
	 * @param errors Errori
	 * @return OperazioniFormBean
	 * @throws Exception
	 */
	public OperazioniFormBean getBeanForm(List<String> errors) throws Exception {
		try {
			OperazioniFormBean form = null;

			String operazione = null;
			// controllo se richiesta corretta
			boolean trovato = false;
			operazione = this.getParameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE);
			if ((operazione == null) || operazione.equals("")) {
				operazione = OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE_IN_CODA;
			}


			String [] tipiOperazione = OperazioniCostanti.getParametroOperazioniOperazioneList();

			for (int i = 0; (i < tipiOperazione.length) && (!trovato); i++) {
				if (operazione.equals(tipiOperazione[i])){ 
					trovato = true;
					continue;
				}
			}

			if (trovato == false) {
				errors.add(OperazioniCostanti.ERRORE_TIPO_OPERAZIONE_SCONOSCIUTO);
				throw new Exception("Tipo Operazione selezionato SCONOSCIUTO.");
			}

			form = new OperazioniFormBean();

			form.setTipo(operazione);

			String idOperazione = this.getParameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_ID);
			if ((idOperazione != null) && !idOperazione.equals("")) {
				form.setIdOperazione(idOperazione);
			}

			// utente 

			String utente = this.getParameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE);

			List<User> userList = new ArrayList<>();
			String utenteTmp = null;
			HttpSession session = this.request.getSession(true);
			User user = ServletUtils.getUserFromSession(this.request, session);
			PermessiUtente permessi = user.getPermessi();

			if(permessi.isUtenti()) {
				utenteTmp = OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE_ALL;
				userList = this.utentiCore.userList(new ConsoleSearch(true));
			} else {
				utenteTmp = user.getLogin();
				userList = new ArrayList<>();
			}

			if(utente == null){	
				form.setUtente(utenteTmp);
			} else 
				form.setUtente(utente);


			form.setListaUser(userList); 

			// Pagina da visualizzare
			String metodo = this.getParameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_METHOD);

			if(metodo == null)
				metodo = OperazioniCostanti.DEFAULT_VALUE_FORM_BEAN_METHOD_FORM;

			form.setMethod(metodo); 

			return form;
		} catch (Exception e) {
			throw new Exception(e);
		}
	}
	
	public List<Parameter> getFormBeanAsParameters(OperazioniFormBean formBean){
		List<Parameter> listaParametri = new ArrayList<>();
		
		if(formBean.getTipo() != null){
			listaParametri.add(new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_OPERAZIONE, formBean.getTipo()));
		}
		
		if(formBean.getMethod() != null){
			listaParametri.add(new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_METHOD, formBean.getMethod()));
		}
		
		if(formBean.getUtente() != null){
			listaParametri.add(new Parameter(OperazioniCostanti.PARAMETRO_OPERAZIONI_UTENTE, formBean.getUtente()));
		}
		
		return listaParametri;
	}


	public void showDettagliMessaggio(Operation op, OperazioniFormBean formBean)
			throws Exception {
		try {

			List<Parameter> lstUrlParam = this.getFormBeanAsParameters(formBean);

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

			lstParam.add(new Parameter(OperazioniCostanti.LABEL_OPERAZIONI, OperazioniCostanti.SERVLET_NAME_OPERAZIONI,lstUrlParam));

			String elencoLabel = OperazioniCostanti.getTipoOperazioneLabelFromValue(formBean.getTipo());
			lstParam.add(new Parameter(elencoLabel, OperazioniCostanti.SERVLET_NAME_OPERAZIONI_LIST, lstUrlParam));
			lstParam.add(new Parameter(
					op.getOperation() + " (" + op.getId() + ") - " + op.getHostname(), null));

			ServletUtils.setPageDataTitle(this.pd, lstParam);

			List<DataElement> dati = new ArrayList<>();
			DataElement de = new DataElement();

			de.setType(DataElementType.TITLE);
			de.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_DETTAGLI);
			dati.add(de);

			DataElement timereq = new DataElement();
			timereq.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_RICHIESTA_IL);
			timereq.setValue("" + op.getTimeReq());
			dati.add(timereq);
			if (OperationStatus.NOT_SET.equals(op.getStatus())) {
				String tmpDet = op.getDetails();
				if ((tmpDet != null) && !tmpDet.equals("")) {
					// Questo caso si verifica quando l'host o il
					// superutente non sono abilitati ad effettuare
					// operazioni
					DataElement errore = new DataElement();
					errore.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_PARAMETRO_ERRORE);
					errore.setValue(formatDetail(op.getDetails()));
					errore.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_ERRORE);
					dati.add(errore);
				}
			} else {
				DataElement timexecute = new DataElement();
				if (op.isDeleted()) {
					timexecute.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_ELIMINATA_IL);
				} else {
					timexecute.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_ESEGUITA_IL);
				}
				timexecute.setValue("" + op.getTimeExecute());
				timexecute.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_TEMPO_ESECUZIONE);
				dati.add(timexecute);
			}
			if (OperationStatus.ERROR.equals(op.getStatus()) ||
					OperationStatus.INVALID.equals(op.getStatus()) ||
					OperationStatus.WAIT.equals(op.getStatus()) ) {
				DataElement errore = new DataElement();
				errore.setLabel(OperazioniCostanti.LABEL_OPERAZIONI_PARAMETRO_ERRORE);
				errore.setValue(formatDetail(op.getDetails()));
				errore.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_ERRORE);
				dati.add(errore);
			}
			if (OperationStatus.WAIT.equals(op.getStatus())) {
				DataElement timeWait = new DataElement();
				timeWait.setLabel(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_WAITING_TIME);
				String tw = "";
				String val = op.getStatus().toString();
				if (val.equals(OperazioniCostanti.DEFAULT_VALUE_PARAMETRO_OPERAZIONI_WAIT_TIME_WAIT)) {
					tw = "" + op.getWaitTime();
				}
				timeWait.setValue(tw);
				timeWait.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_WAIT_TIME);
				dati.add(timeWait);
			}

			DataElement partitle = new DataElement();
			partitle.setType(DataElementType.TITLE);
			partitle.setLabel(OperazioniCostanti.LABEL_PARAMETRI);
			dati.add(partitle);

			org.openspcoop2.web.lib.queue.dao.Parameter[] parList = op.getParameters();
			for (int i = 0; i < parList.length; i++) {
				org.openspcoop2.web.lib.queue.dao.Parameter singlePar = parList[i];

				DataElement par = new DataElement();
				String name = singlePar.getName();
				par.setLabel(name);
				if (name.equals(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_PASSWORD) ||
						name.equals(OperazioniCostanti.LABEL_PARAMETRO_OPERAZIONI_NUOVA_PASSWORD)) {
					par.setValue("********");
				} else {
					par.setValue(singlePar.getValue()); 
				}
				par.setType(DataElementType.TEXT);
				par.setName(OperazioniCostanti.PARAMETRO_OPERAZIONI_PAR);
				dati.add(par);
			}

			this.pd.setDati(dati);
			this.pd.setMode(Costanti.DATA_ELEMENT_EDIT_MODE_DISABLE_NAME);
		} catch (Exception e) {
			throw new Exception(e);
		}
	}
	
	private String formatDetail(String detail){
		if(detail==null){
			return null;
		}
		else{
			return detail.replaceAll("\n", org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
		}
	}
}