Newsgroup: it.comp.java
Titolo: Rollback di una applicazione... per chi ha voglia di leggere

Ciao a tutti, 
ho la seguente questione da porvi:
Qual'e' il modo migliore secondo voi per effettuare un rollback
di una applicazione.
Mi spiego meglio portando un mio caso.
Flusso dell'applicazione
Setup configurazione contenuta in un file properties (<cliente>.properties)
1. Connessione ad un server ftp remoto
2. Prelievo di 2 file e assegnazione di un nome univoco in una mia tmp dir
3. Controllo integrita' dei dati contenuti nei file
4. Connessione a database remoto
5. Query per prelievo di un codice interno di partenza
6. Processo il primo file eseguento insert o update sul db remoto 
   a seconda di un flag contenuto su ogni riga
7. Replico gli step 5 e 6 per il secondo file
8. Connessione a database locale
9. Inserimento di due record su db locale(indica cliente e record inseriti o aggiornati)
10. Eliminazione dei due file locali creati allo step 2
11. Invio via mail di un rapporto sull'esecuzione di questo processo
    (tempo impiegato, recordi inseriti/aggiornati pero ogni file, codici non trovati etc etc)
In caso di qualsiasi Exception mando una mail di errore contenente 
l'errore.
Ora, la mia necessita e' quella in caso, per esempio di eccezione allo step 7, 
di processare una serie di metodi che in sequenza riportino allo stato originale i 
dati della tabella eventualmente modificata allo step 7, allo step 6 e che venga effettuata 
l'eliminazione dei file creati allo step 2.
Considerate che ho un metodo processData che scatena tutta la serie di 
operazioni sopra elencate e che tutte le eccezzioni possibili ed immaginabili(spero)
arrivano a questo motodo per "passaggio" dagli altri metodi e classi chiamate al suo interno,
quindi ho una cosa tipo:
public void processData() {
    try {
        //--> codice codice codice
    } catch(Exception e) {   
 
    }   
}
Poi ho una classe RollbackProcess che al suo interno ha definito una serie di const e un
array(per ora poi faro' una collection perche per ora devo poi modificare le String con
Integer.parseInt per confrontare < o >)
class RollbackProcess {
    public static void String FTP_CONNECTION = "10";
    public static void String GET_REMOTE_DATA = "20";
    public static void String CHK_INTEGRITY = "30";   
    public static void String DB_REMOTE_CONNECTION = "40";
    public static void String GET_CODE_A = "50";
    public static void String PROCESS_DATA_A = "60";
 
    etc etc
 
    private String[][] flow_control = { {FTP_CONNECTION,"metododachiamare1"}, 
                                        {GET_REMOTE_DATA,"metododachiamare2"}, 
                                        {CHK_INTEGRITY,"metododachiamare3"},
                                        {DB_REMOTE_CONNECTION,"metododachiamare4"} }
 
    etc etc
 
}
Durante il processo processData all'interno dei vari metodi chiamati faccio,
a seconda di dove sono arrivato, un this.setStepControl(RollbackProcess.PROCESS_DATA_A) se sono 
arrivato allo step 6 ... e cosi via.
Il metodo  processData e' diventato cosi: 
public void processData() {
    try {
        //--> codice codice codice
    } catch(Exception e) {   
        RollbackProcess rb = new RollbackProcess(this);
        rb.setLastStep(this.getStepControl);
        rb.executeRollback();
    }   
}
Il metodo executeRollback si occupa di eseguire un ciclo allinterno di flow_control
girandolo prima al contrario e confrontando lo stepControl passato dalla prima classe
con quelli presenti se lo stepControl e' <= alla chiave dell'array bidimensionale 
viene chiamato il metodo corrispondente al valore (utilizzo le Reflection).
Quindi se sono allo step 6 e viene generata un'eccezione la classe RollbackProcess
esegue in sequenza una serie di metodi
for (int i = 0; i < flow_control.lenght; i++) {
    int max_set = Integer.parseInt(this.lastStep);
 
    if( max_set <= Integer.parseInt(flow_control.[i][0])) {
        //chiamo il metodo flow_control.[i][1]
    }
}
Non so se mi sono spiegato abbastanza bene, in caso positivo avete(sicuramente) 
idee migliori (o sistemi gia' "fatti")?
Grazie a tutti per la pazienza,
Cristian.

 di una applicazione.
In casi come questo potrebbe risultare molto comodo il Command Pattern
http://www.mattberther.com/2004/09/000549.html
pole
-- 
ammentos - a lightweight persistence framework for JDK5
http://www.sourceforge.net/projects/ammentos
http://ammentos.biobytes.it

 
http://www.mattberther.com/2004/09/000549.html
Qui credo che avro' bisogno di approfondire un po di piu' le mie 
conoscenze sul design patterns in generale :)
Ciao,
crx.

 conoscenze sul design patterns in generale :)
Prova questo
http://www.javaworld.com/javaworld/jw-06-1998/jw-06-undoredo.html
mi pare abbastanza semplice e chiaro!
Saluti
CarMas