/*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
* This file is part of jAPS software.
* jAPS is a free software;
* you can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions
* and limitations under the License
*
*
*
* Copyright 2005 AgileTec s.r.l. (http://www.agiletec.it) All rights reserved.
*
*/
package com.agiletec.aps.system.services.controller;
import java.util.List;
import com.agiletec.aps.system.ApsSystemUtils;
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).<br>
* Il controller costituisce la logica della servlet di control-dispatching.
* Per ulteriori dettagli vedere il metodo service().
* @author
*/
public class ControllerManager extends AbstractService {
@Override
public void init() throws Exception {
ApsSystemUtils.getLogger().config(this.getClass().getName() + ": initialized "
+ this.getControllerServices().size() + " controller services");
}
/**
* 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.<br>
* Le regole sono:
* <ul>
* <li> i sottoservizi non devono lanciare eccezioni;
* <li> se un sottoservizio riceve in ingresso ERROR deve terminare
* immediatamente restituendo ERROR, a meno che non sia un servizio di
* gestione degli errori;
* <li> se un servizio restituisce OUTPUT o REDIRECT o SYS_ERROR la sequenza
* di esecuzione termina;
* <li> se un servizio restituisce CONTINUE la sequenza continua.
* </ul>
* @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) {
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<ControlServiceInterface> getControllerServices() {
return _controllerServices;
}
public void setControllerServices(List<ControlServiceInterface> controllerServices) {
this._controllerServices = controllerServices;
}
/**
* La lista interna dei sottoservizi di controllo
*/
private List<ControlServiceInterface> _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;
}