All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.agiletec.aps.system.services.controller.ControllerManager Maven / Gradle / Ivy

/*
 * Copyright 2015-Present Entando Inc. (http://www.entando.com) All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */
package com.agiletec.aps.system.services.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.agiletec.aps.system.RequestContext;
import com.agiletec.aps.system.common.AbstractService;
import com.agiletec.aps.system.services.controller.control.ControlServiceInterface;

/**
 * Il controller è il servizio di controllo dell'esecuzione relativa ad una 
 * richiesta del client. L'esecuzione è realizzata invocando in sequenza
 * i sottoservizi di controllo definiti in configurazione (che implementano 
 * ControlServiceInterface).
* Il controller costituisce la logica della servlet di control-dispatching. * Per ulteriori dettagli vedere il metodo service(). * @author M.Diana */ public class ControllerManager extends AbstractService { private static final Logger _logger = LoggerFactory.getLogger(ControllerManager.class); @Override public void init() throws Exception { _logger.debug("{}: initialized {} controller services", this.getClass().getName(), this.getControllerServices().size()); } /** * Esegue le azioni conseguenti alla richiesta del client. * L'esecuzione è realizzata invocando in sequenza * i sottoservizi di controllo definiti in configurazione (implementano * ControlServiceInterface); ogni sottoservizio termina con un valore di * ritorno compreso fra le costanti definite in questa classe. Il valore di * uscita di ogni sottoservizio è inviato in ingresso al sottoservizio * successivo. Il valore di ritorno dell'ultimo sottoservizio eseguito * è restituito al chiamante.
* Le regole sono: *
    *
  • i sottoservizi non devono lanciare eccezioni; *
  • se un sottoservizio riceve in ingresso ERROR deve terminare * immediatamente restituendo ERROR, a meno che non sia un servizio di * gestione degli errori; *
  • se un servizio restituisce OUTPUT o REDIRECT o SYS_ERROR la sequenza * di esecuzione termina; *
  • se un servizio restituisce CONTINUE la sequenza continua. *
* @param reqCtx Il contesto della richiesta. * @return Uno dei valori definiti dalle costanti della classe. */ public int service(RequestContext reqCtx) { int status = INVALID_STATUS; int srvIndex = 0; try { do { ControlServiceInterface srv = this.getControllerServices().get(srvIndex); srvIndex++; status = srv.service(reqCtx, status); } while (srvIndex < this.getControllerServices().size() && status != OUTPUT && status != REDIRECT && status != SYS_ERROR); } catch (Throwable t) { _logger.error("generic error", t); //ApsSystemUtils.logThrowable(t, this, "service"); status = SYS_ERROR; } return status; } /** * Restituisce una descrizione dello stato passato come argomento. * @param status Lo stato di cui si vuole la descrizione. * Deve essere una delle costanti di questa classe. * @return La descrizione dello stato, oppure "non definito" * se lo stato non ha un valore previsto. */ public static String getStatusDescription(int status) { switch (status) { case INVALID_STATUS: return "INVALID_STATUS"; case OUTPUT: return "OUTPUT"; case REDIRECT: return "REDIRECT"; case ERROR: return "ERROR"; case CONTINUE: return "CONTINUE"; case RESTART: return "RESTART"; case SYS_ERROR: return "SYS_ERROR"; default: return "non definito"; } } protected List getControllerServices() { return _controllerServices; } public void setControllerServices(List controllerServices) { this._controllerServices = controllerServices; } /** * La lista interna dei sottoservizi di controllo */ private List _controllerServices; /** * Stato di uscita dei sottoservizi di controllo: stato non valido. E' * il valore iniziale, passato in ingresso al primo sottoservizio. */ public static final int INVALID_STATUS = 0; /** * Stato di uscita dei sottoservizi di controllo: generato output. * Lo stato, nella esecuzione della catena di sottoservizi, corrisponde ad una uscita dalla sequenza. */ public static final int OUTPUT = 1; /** * Stato di uscita dei sottoservizi di controllo: richiesta redirezione. * Lo stato, nella esecuzione della catena di sottoservizi, corrisponde ad una uscita dalla sequenza. */ public static final int REDIRECT = 2; /** * Stato di uscita dei sottoservizi di controllo: errore. * Lo stato, nella esecuzione della catena di sottoservizi, NON corrisponde ad una uscita dalla sequenza. */ public static final int ERROR = 3; /** * Stato di uscita dei sottoservizi di controllo: continuare con l'esecuzione. */ public static final int CONTINUE = 4; /** * Stato di uscita dei sottoservizi di controllo: riprendere la sequenza di * esecuzione dall'inizio (deprecato). * @deprecated */ public static final int RESTART = 5; /** * Stato di uscita finale: errore di sistema. * Lo stato, nella esecuzione della catena di sottoservizi, corrisponde ad una uscita dalla sequenza. */ public static final int SYS_ERROR = 6; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy